<a ng-if="leftNavParent.ChildNavigationLinks.length > 0" href="#!"
class="activeContent ng-binding ng-scope" ng-
click="leftNavCtrl.leftNavHeaderClicked(leftNavParent)">
ADMINISTRATIVE MODULE
</a>
我有一个web元素,如上图所示。我发现它是
driver.findElement(By.linkText("ADMINISTRATIVE MODULE")).click();
这是在嵌套div元素中的左侧菜单栏中。 我的问题是当我运行selenium脚本时,它给了我一个例外
unknown error: Element <a ng-if="leftNavParent.ChildNavigationLinks.length > 0" href="#!"
class="activeContent ng-binding ng-scope" ng-click="leftNavCtrl.leftNavHeaderClicked(leftNavParent)">...
</a> is not clickable at point (99, 207). Other element would receive the click:
<div class="blockUI blockOverlay" style="z-index: 1000; border: none; margin: 0px; padding: 0px;
width: 100%; height: 100%; top: 0px; left: 0px; background-color: rgb(0, 0, 0); opacity: 0;
cursor: wait; position: fixed;"></div>
但是当我在调试模式下运行脚本时,它会点击该元素。 知道为什么会发生这种情况也会发生
org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"link text","selector":"ADMINISTRATIVE MODULE"}
答案 0 :(得分:0)
使用以下代码而不是sleep或wait语句来确定网页已完成加载:
public static void waitForPageToLoad() {
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver wdriver) {
return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}
});
}
<强>更新强>
为了回答你建议的编辑,你提出了一个额外的问题,我会将上面的方法放在一个帮助器类中,然后在你的步骤类或页面对象中导入该类。例如,在我的情况下,它在一个有大量辅助对象的类中,其中大多数包装各种selenium方法,如click,sendKeys等。而不是直接在测试代码中单击Selenium,我把它留给我页面对象为我做点击,除此之外,我在页面对象本身内调用waitForPageToLoad,因此测试方法可能会说:
pageObject.clickLogonButton();
在您的情况下,看起来您正在将驱动程序对象传递给每个页面对象方法,因此请根据需要进行调整。然后在pageobject内部,我可能会:
public void clickLogonButton() {
myHelper.waitForPageToLoad();
logonButton.click();
}
这是否清楚了?
答案 1 :(得分:-1)
今天我读了关于简单页面对象的this blog post。
使用哪个框架并不重要,但我喜欢implicit assertions and waits的想法。
主要好处是您不必自己关心这些同步问题。
如果您更喜欢使用普通的WebDriver API,Bill的建议就可以了!