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


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

使用以下代码代替睡眠或等待语句确定网页已完成加载:

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

update

在回答您的建议编辑时,您提出了一个其他问题,我将上述方法放在助手类中,然后将该类导入您的步骤类或页面对象。例如,就我而言,它是在具有一系列辅助对象的类中页面对象为我单击,除此之外,我调用页面对象本身内的waitforpagetoload,因此测试方法可能会说:

pageObject.clickLogonButton();

在您的情况下,似乎您将驱动程序对象传递给每个页面对象方法,因此请根据需要进行调整。然后在PageObject本身内,我可能有:

public void clickLogonButton() {
    myHelper.waitForPageToLoad();
    logonButton.click();
}

这清除了吗?

今天我阅读了有关简单页面对象的博客文章。

您使用哪个框架并不重要,但是我喜欢有隐式断言和等待的想法。

主要好处是您不必自己关心这些同步问题。

如果您喜欢使用普通的WebDriver API,则Bill的建议很好!

最新更新