我遇到的问题是Firefox Webdriver无法正确判断元素是否可见:这是我正在使用的代码,它返回该元素是可见的,尽管它不是
wait.ignoring(UnhandledAlertException.class).until(ExpectedConditions.visibilityOfElementLocated(By.id("ad")));
现在,如果我正在测试一个网站,该网站可以在网站的源代码中找到但是不可见(例如,因为它前面有另一个元素)。从我可以收集的visibilityOfElementLocated
方法只检查元素的宽度和高度是否> 0,不是吗?
有没有办法检查在网站上冲浪的用户是否真的可见,考虑到错误的布局和错误的z索引等?这真的很棒......
谢谢!
答案 0 :(得分:3)
您确定您没有尝试实际测试presenceOfElementLocated而不是visibilityOfElementLocated吗?只有在您搜索的定位器设置了显示CSS属性时,visibilityOfElementLocated才有效。有些人使用“.findElements(By).size()> 0”来测试“elementExists”,但这里有一种需要处理异常的替代方法。
这可能有点矫枉过正,但您可以编写自己的可见性功能。在这个例子中,我称之为“elementExists()”。它测试“presenceOf”,但如果有的话,则处理“visiblity”异常:
public boolean elementExists( By locator ) {
WebElement foo = null;
try {
foo = this.getElementByLocator( locator, 10 );
} catch ( TimeoutException te) {
System.out.println("There was a timeout looking for element: " +
locator.toString() );
//Swallow exception: ExceptionUtils.getMessage(te);
return false;
} catch ( ElementNotVisibleException env ) {
System.out.println("The element was found but is invisible: " +
locator.toString() );
//Swallow exception: ExceptionUtils.getMessage(env);
return false;
}
if ( foo == null ) {
return false;
} else {
return true;
}
}
public WebElement getElementByLocator( By locator, int timeout ) {
System.out.println("Calling method getElementByLocator: " +
locator.toString() );
int interval = 5;
if ( timeout <= 20 ) interval = 3;
if ( timeout <= 10 ) interval = 2;
if ( timeout <= 4 ) interval = 1;
Wait<WebDriver> wait = new FluentWait<WebDriver>( se.myDriver )
.withTimeout(timeout, TimeUnit.SECONDS)
.pollingEvery(interval, TimeUnit.SECONDS)
.ignoring( NoSuchElementException.class,
StaleElementReferenceException.class );
WebElement we = wait.until( ExpectedConditions
.presenceOfElementLocated( locator ) );
return we;
}
答案 1 :(得分:0)
protected void asChk(By what, int presence) {
asChk(what, presence, false);
}
protected void asChk(By what, int presence, boolean isGreater) {
List<WebElement> boxesHeader = driver.findElements(what);
if(isGreater)
assertTrue(boxesHeader.size() >= presence);
else
assertTrue(boxesHeader.size() == presence);
}
试试这段代码。
如何使用它:
asChk(By。 localizator (* localizatorDomValue *),1);
或:
asChk(By。 localizator (* localizatorDomValue *),1,true); - 如果你知道不止一个,但不知道确切的数字。
最诚挚的问候, MichałFelicjańczuk