webdriver 第二次没有按类名定位元素

Posted

技术标签:

【中文标题】webdriver 第二次没有按类名定位元素【英文标题】:webdriver is not locating an element by class name the second time 【发布时间】:2016-04-14 23:41:49 【问题描述】:

我在被测 Web 应用程序的每个页面上都有一个“下一步”按钮。在表单的第一页上,我可以选择 Next 元素并单击,在第二页中,选择并单击相同的元素会引发错误:

-> 错误:意外错误。元素在点 (1007.5, 244.14999389648438) 处不可点击。其他元素会收到点击:

这是元素的 html: div class="提交区域" 输入 class="back-button btn" type="button" value ="Back"> 输入 class="trigger-next-button btn btn-primary" type="button" value ="Next"> 输入 class="next-button btn btn-primary" type="button" value ="Next"> style="display: none;" /div>

这是点击按钮的代码:

var nextBTN = testhelper.FireFoxBrowser.FindElement(By.ClassName("trigger-next-button"));
nextBTN.Click();

【问题讨论】:

当我在这一步之前的步骤中添加以下代码时:System.Threading.Thread.Sleep(6000) 然后它就可以工作了。这是否意味着 webdriver 在页面完全加载之前尝试单击?如果是这样,webdriver 中是否有任何命令等待页面加载后再继续? 【参考方案1】:

基于添加睡眠按预期工作的事实,听起来您的代码似乎领先于 WebDriver。您需要执行某种同步以使它们彼此同步。我会像这样使用过时检查:

WebDriverWait wait = new WebDriverWait(driver, 60); // 60 is the time to wait, can be extended as needed. This is an 'up-to' wait and will not necessarily stop for 60 seconds.
    var nextBTN = testhelper.FireFoxBrowser.FindElement(By.ClassName("trigger-next-button"));
nextBTN.Click();
//Wait for that button to 'go away' before proceeding.
wait.until(ExpectedConditions.stalenessOf(nextBTN));
//Wait for another instance of the button to appear and be clickable before proceeding.
wait.until(ExpectedConditions.elementToBeClickable(By.ClassName("trigger-next-button")));
nextBTN = testhelper.FireFoxBrowser.FindElement(By.ClassName("trigger-next-button"));
nextBTN.Click();
wait.until(ExpectedConditions.stalenessOf(nextBTN));

有关等待和预期条件的更多信息,请参阅这些:

https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp

【讨论】:

【参考方案2】:

当按钮在当前监视器视图中不可见或元素不存在或不可点击时,通常会出现此错误。尝试使用以下代码。

Webdriverwait 等待 = new webdriverwait(driver, 60);

Actions builder = new Actions(driver);

Webelement element = wait.until(ExpectedConditions.elementtobeclickable(By.xpath('xpath'));

Builder.movetoelement(element).click().perform();

【讨论】:

以上是关于webdriver 第二次没有按类名定位元素的主要内容,如果未能解决你的问题,请参考以下文章

Selenium webdriver有没有Verify值的方法

selenium学习笔记webdriver进行页面元素定位

WebDriver API 元素定位

Web自动化测试项目BasePage实现

Selenium WebDriver定位元素

WebDriver定位元素方法