findElement(By.linkText在脚本中不起作用。但是当我在调试模式下运行时,它正在工作

时间:2018-03-26 17:06:34

标签: selenium-webdriver selenium-chromedriver

 <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"}

2 个答案:

答案 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的建议就可以了!