我正在使用页面对象模型
我的Firefox版本是47.01,Selenium Server版本是2.53.1
我在执行testNG时遇到错误:
失败:startTest org.openqa.selenium.WebDriverException:元素是 点(1258,50)无法点击。其他元素会收到 单击:命令持续时间或超时:79 毫秒
以下是我已尝试过的内容:
我的等待代码在Test_Base类中,声明了wait:
public void waitForElement(Wait<WebDriver> wait){
System.out.println("#####Insidewait");
if(wait == null){
//this.wait = new WebDriverWait(myBrowser, 20);
this.wait = new FluentWait<WebDriver>(myBrowser)
//Timeout time is set to 20
.withTimeout(20, TimeUnit.SECONDS)
// polling interval
.pollingEvery(500, TimeUnit.MILLISECONDS)
//ignore the exception
.ignoring(NoSuchElementException.class, ElementNotVisibleException.class);
}
}
Test_Script001类扩展了Test_Base类,其中使用了wait对象:
By upgrade = By.xpath("//a[text()='Upgrade']");
By loader = By.xpath("//div[@id='dashBoardLoader'and contains(@style,'display: block')]");
By logout = By.xpath("//a[text() = 'Logout']");
Home home = null;
LogIN login = null;@Test
public void startTest() throws Exception {
login.loginToApplication(repository.getProperty("username"), repository.getProperty("password"));
wait.until(ExpectedConditions.invisibilityOfElementLocated(loader));
wait.until(ExpectedConditions.visibilityOfElementLocated(upgrade)).isDisplayed();
WebElement btnUpgrade = myBrowser.findElement(upgrade);
if(btnUpgrade.isDisplayed()){
//myBrowser.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
home.ClickOnLogout();
wait.until(ExpectedConditions.urlContains(logoutURL));
System.out.println("Clicked on logout successfully..");
}
else
System.out.println("Unable to click on logout.");
}
答案 0 :(得分:0)
这可能是一个时间问题。期望ExpectedConditions.visibilityOfElementLocated
并不真正等待可见性。它等待元素以正大小和不透明度显示,但该元素仍然可以被另一个元素覆盖。
要解决此问题,您可以重试点击直至成功:
new WebDriverWait(driver, 6).until((WebDriver drv) -> {
try {
element.click();
return true;
} catch (WebDriverException ex) {
return false;
}
});
如果元素显示有一些过渡效果,您也可以尝试等待特定大小:
// wait minimum width / height
new WebDriverWait(driver, 6).until((WebDriver drv) -> {
Dimension size = element.getSize();
return size.getWidth() > 15 && size.getHeight() > 15 ? element : null;
}).click();
答案 1 :(得分:0)
我已多次遇到这种情况。通常在关闭具有模态(灰色)背景但没有足够快地关闭的对话框之后,等等。我做的是将一对夫妇等在一起,我等待模态背景(或其他)不可见然后等待元素可点击/可见。
错误消息应告诉您哪个元素会收到点击...那就是您要等待隐身的元素。
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.invisibilityOfElementLocated(locator)); // blocking element
wait.until(ExpectedConditions.elementToBeClickable(locator)).click(); // desired element
答案 2 :(得分:0)
所有,非常感谢你的帮助..
我的应用程序具有从DOM上的服务器呈现的控件,但是使用CSS属性(例如display:block和display:none)在客户端控制元素的可见性。
我使用的函数用于检查DOM中存在的元素(服务器呈现),因此等待返回true并且同步失败;虽然我假设等待失败了!
使用客户端属性的函数
解决了等待时间问题ExpectedConditions.attributeToBe(定位器,属性,值);
即而不是
wait.until(ExpectedConditions.invisibilityOfElementLocated(元件));
wait.until(ExpectedConditions.visibilityOfElementLocated(元件))isDisplayed();
wait.until(ExpectedConditions.presenceofElement(元件))isDisplayed();
<强>使用强>
ExpectedConditions.attributeToBe(locator,attribute,value);