Перейти к содержимому

Фотография

WebDriverException: Cannot determine size of element

getLocation() WebDriverException getSize() HtmlUnitDriver

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 ChuckNorris

ChuckNorris

    Новый участник

  • Members
  • Pip
  • 7 сообщений

Отправлено 05 апреля 2017 - 12:59

Столкнулся с проблемой, что при попытке получить размер или положение элемента функциями getSize() и getLocation() получаю следующее исключение: WebDriverException: Cannot determine size of element.

 

Меня интересует: так и должно быть для HtmlUnitDriver?
Когда я попробовал на FirefoxDriver функции getSize() и getLocation() отработали нормально.
В чем подвох с HtmlUnitDriver?

​Использовал Selenium WebDriver v 3.3.1. Java

WebDriver dr;
//*
System.setProperty("webdriver.gecko.driver", "/path/to/geckodriver"); // geckodriver-v0.15.0
dr = new FirefoxDriver();
/*/
dr = new HtmlUnitDriver();
//*/
		
dr.get("an_URL");
WebElement el = dr.findElement(By.className("a_class_name"));
System.out.println(el.getLocation().getX()); // Если HtmlUnitDriver - WebDriverException. Если FirefoxDriver - выводит значение

dr.quit();
 

  • 0

#2 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 05 апреля 2017 - 14:11

Паузу поставь, например

Thread.sleep(3000);


  • 0

#3 ChuckNorris

ChuckNorris

    Новый участник

  • Members
  • Pip
  • 7 сообщений

Отправлено 05 апреля 2017 - 14:18

Паузу поставь, например

Thread.sleep(3000);

К сожалению не помогло.


  • 0

#4 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 05 апреля 2017 - 14:26

а какая версия HtmlUnitDriver ?

просто обновитесь до последней

а так больше не знаю, чем помочь


  • 0

#5 ChuckNorris

ChuckNorris

    Новый участник

  • Members
  • Pip
  • 7 сообщений

Отправлено 05 апреля 2017 - 14:50

Я подгружаю библиотеки:

client-combined-3.3.1-nodeps.jar
и
selenium-server-standalone-3.3.1.jar

В последней собственно и находится HtmlUnitDriver.


  • 0

#6 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 06 апреля 2017 - 08:46

WebDriverException: Cannot determine size of element.

Я лишь предполагаю, но мне кажется это логичным. Ведь при HtmlUnitDriver браузер не запускается, поэтому определить "реальные" размеры и положение элемента на странице не представляется возможным.


  • 0

#7 ChuckNorris

ChuckNorris

    Новый участник

  • Members
  • Pip
  • 7 сообщений

Отправлено 06 апреля 2017 - 09:57

 

WebDriverException: Cannot determine size of element.

Я лишь предполагаю, но мне кажется это логичным. Ведь при HtmlUnitDriver браузер не запускается, поэтому определить "реальные" размеры и положение элемента на странице не представляется возможным.

 

 

Ну я так не думаю. Все-таки HtmlUnitDriver должен уметь распарсить HTML и CSS чтобы вычислить положения элементов. Для этого не обязательно отображать их в реальном окне, ведь это уже вторично.


  • 0

#8 ChuckNorris

ChuckNorris

    Новый участник

  • Members
  • Pip
  • 7 сообщений

Отправлено 06 апреля 2017 - 12:06

В общем пришел к такому выводу:

Методы getSize() и getLocation() используют javascript через вызов функции executeScript(). Поэтому как минимум надо указать поддержку js
dr = new HtmlUnitDriver(true);
Но к сожалению это не гарантирует нормальную работу так как HtmlUnitDriver не очень дружит с js.
 

Буду пробовать PhantomJSDriver


  • 0

#9 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 06 апреля 2017 - 15:31

В общем, нашел подтверждения своей версии, в одном из постов Алексея Баранцева

Да, это полноценный браузер – он строит DOM и у него есть интерпретатор JavaScript.


Отличие от "настоящих" браузеров заключается в том, что отсутствует модуль "отрисовки" (рендеринга), поэтому он не умеет определять координаты элементов, их перекрытия, поэтому некоторые сложные действия в нём выполнить не получается.

  • 0

#10 sergueik

sergueik

    Постоянный участник

  • Members
  • PipPipPip
  • 166 сообщений
  • ФИО:кузьмин сергей

Отправлено 07 апреля 2017 - 02:26

а ссылка на сайт есть - где  не получается опр размеры  ? 


  • 0

#11 ChuckNorris

ChuckNorris

    Новый участник

  • Members
  • Pip
  • 7 сообщений

Отправлено 07 апреля 2017 - 08:53

а ссылка на сайт есть - где  не получается опр размеры  ? 

 

https://www.hippsonmarket.se/


  • 0

#12 sergueik

sergueik

    Постоянный участник

  • Members
  • PipPipPip
  • 166 сообщений
  • ФИО:кузьмин сергей

Отправлено 07 апреля 2017 - 12:39

я попробую ваш url попозже (на работу надо идти) -  вот как - из 

https://github.com/s...SuvianTest.java

 

 
@Test(enabled = true)
public void test18_2() {
// Arrange
driver.get("http://suvian.in/sel...ressBar.html");
 
WebElement button1 = wait.until(
ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector(
".container .row .intro-message button:nth-of-type(1)"))));
assertThat(button1, notNullValue());
assertThat(button1.getAttribute("disabled"), nullValue());
 
WebElement button2 = wait.until(
ExpectedConditions.visibilityOf(driver.findElement(By.id("button2"))));
assertThat(button2, notNullValue());
assertThat(button2.getAttribute("disabled"), notNullValue());
 
WebElement progressBar = wait.until(
ExpectedConditions.visibilityOf(driver.findElement(By.id("myBar"))));
assertThat(progressBar, notNullValue());
assertThat(progressBar.getAttribute("style"), notNullValue());
WebElement progressBarContainer = progressBar.findElement(By.xpath(".."));
int denom = Integer.parseInt(
styleOfElement(progressBarContainer, "width").replace("px", ""));
// Act
button1.click();
 
// Evaluate the progressBar width to reach 100% - need a longer wait timeout
try {
(new WebDriverWait(driver, 60)).until(new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver d) {
Pattern p = Pattern.compile("([0-9.]+)px",
Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
float percentage = Float.parseFloat(
p.matcher(styleOfElement(progressBar, "width")).replaceAll("$1"))
/ denom;
System.err.println("Progress Bar: " + percentage);
return (percentage >= .97);
}
});
} catch (Exception e) {
System.err.println("Exception: " + e.toString());
}
// Assert
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
System.err.println(
"Button2 attribute check (1) : " + button2.getAttribute("outerHTML"));
button2.click();
try {
// confirm alert
driver.switchTo().alert().accept();
} catch (NoAlertPresentException e) {
// Alert not present - ignore
} catch (WebDriverException e) {
System.err
.println("Alert was not handled : " + e.getStackTrace().toString());
return;
}
// NOTE: latency
System.err.println(
"Button2 attribute check (2) : " + button2.getAttribute("outerHTML"));
}

 

private String styleOfElement(WebElement element, Object... arguments) {

String getStyleScript = getScriptContent("getStyle.js");
 
return (String) executeScript(getStyleScript, element, arguments);
}
 

 
сам скрипт -  из

 http://www.htmlgoodi...id=88eQV8NzD6Q 
 https://developer.mo...etComputedStyle
 

getStyle = function(element, property) {
var result = '';
if (window.getComputedStyle) {
var styleObj = window.getComputedStyle(element, null);
// var styleObj = document.defaultView.getComputedStyle(element, null);   
if (undefined !=  property ) {
result = styleObj.getPropertyValue(property);
} else {
var len = styleObj.length;
for (var i = 0; i < len; i++) {
var style = styleObj[i];
result += '  ' + style + ':' + styleObj.getPropertyValue(style) + '\n';
}
}
}
// IE lacks getComputedStyle but has currentStyle 
else if (element.currentStyle) {
try {
result = element.currentStyle[property];
} catch (e) {}
}
return result;
}
 
var element = arguments[0];
var property = arguments[1];
return getStyle(element, property);


  • 0

#13 ChuckNorris

ChuckNorris

    Новый участник

  • Members
  • Pip
  • 7 сообщений

Отправлено 11 апреля 2017 - 09:27

В общем с PhantomJSDriver все получилось.

В отличие от HtmlUnitDriver он умеет определять положение и размеры элементов,

имеет движок webkit и кроме того умеет делать скриншоты.
То есть для моей задачи он подходит лучше.


 

// Do PhantomJSDriver
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "/path/to/phantomjs-2.1.1-macosx/bin/phantomjs"); 

WebDriver dr = new PhantomJSDriver(caps);
		
dr.manage().window().setPosition(new Point(0,0));
dr.manage().window().setSize(new Dimension(1200,768));
		
dr.get("https://translate.google.com");
System.out.println(dr.getCurrentUrl());
		
// Make screenshot
File screenshot = ((TakesScreenshot) dr).getScreenshotAs(OutputType.FILE);
String path = "/path/to/screenshots/" + screenshot.getName();
FileUtils.copyFile(screenshot, new File(path));
		
// Run a js
if (dr instanceof JavascriptExecutor) {
	System.out.println("Title Of site : " + (String) ((JavascriptExecutor)dr).executeScript("return document.title;") );
} else {
    throw new IllegalStateException("This driver does not support JavaScript!");
}
		
// Size and location an element
WebElement el = dr.findElement(By.id("source-is"));

System.out.println(el.getText());
System.out.println(el.getLocation().getX());
System.out.println(el.getLocation().getY());
System.out.println(el.getSize().height);
System.out.println(el.getSize().width);

dr.quit();


  • 0



Темы с аналогичным тегами getLocation(), WebDriverException, getSize(), HtmlUnitDriver

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных