首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误:当使用动态Xpath访问元素时,元素不可见,而相对Xpath工作正常。

错误:当使用动态Xpath访问元素时,元素不可见,而相对Xpath工作正常。
EN

Stack Overflow用户
提问于 2017-05-04 06:15:11
回答 2查看 171关注 0票数 0

我正在尝试点击一个保存按钮。保存按钮的Html:

代码语言:javascript
运行
复制
<div class="button button--large ng-binding" ng-click="params.applyWrapper()">Save</div>

现在,当我使用相对xpath获得单击时,它工作得很好。没有出现错误,并单击此元素是成功的。

代码语言:javascript
运行
复制
driver.findElement(webdriver.By.xpath(".//*[@id='navcontainer']/ons-page[4]/div[2]/div/ng-form/fieldset/ul/li[8]/div")).click();

但是,如下所示,使用动态xpath会产生一个错误"ElementNotVisibleError: element不可见“

代码语言:javascript
运行
复制
driver.findElement(webdriver.By.xpath(".//div[contains(text(),'Save')]")).click();

原因是什么?如何使用动态xpath单击这个元素?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-09 06:37:41

关于为什么出现元素不可见错误的解释是,上一页也有一个“Save”按钮,因为在大多数实现中,我们不会破坏前一页,只会隐藏它,所以webdriver在上一页上定位了Save按钮,但是无法访问它,因为它是隐藏的,因此错误元素不可见。使用绝对xpath可以有效地区别上一页和当前页上的Save按钮,而对于“Save”按钮的动态xpath则完全相同。(考虑到没有任何属性使xpath与众不同。)

代码语言:javascript
运行
复制
driver.findElement(By.xpath("//*[text()='Save']")).click();

现在,我们需要一种使两个“Save”按钮都不同的动态xpath的方法。这可以通过使用Xpath方法来完成。在此方法中,我们标识要访问的元素之前或后面的元素,并就前面/下面的元素编写xpath。

在我的例子中,当前页面上的“Save”按钮前面有一个输入标记,而在上一页上的Save按钮前面有一个span标记。这允许我按照以下方式区分这两个按钮的xpath:

当前页面上保存按钮的Xpath:

代码语言:javascript
运行
复制
driver.findElement(By.xpath("//input[@name='defaults']//following::div[1]")).click();

这个xpath中的//following::div1表示'Save‘按钮,它前面有一个输入标记。

上一页上保存按钮的Xpath:

代码语言:javascript
运行
复制
driver.findElement(By.xpath("//span[text()='Test']//following::div[1]")).click();

这个xpath中的//following::div1表示'Save‘按钮,它前面有一个span标记。

票数 0
EN

Stack Overflow用户

发布于 2017-05-04 11:24:27

正如您提到的,这个绝对xpath起作用了:

代码语言:javascript
运行
复制
driver.findElement(webdriver.By.xpath(".//*[@id='navcontainer']/ons-page[4]/div[2]/div/ng-form/fieldset/ul/li[8]/div")).click();

这种逻辑xpath也应该可以工作:

代码语言:javascript
运行
复制
driver.findElement(webdriver.By.xpath("//div[@class='button button--large ng-binding'][text()='Save']")).click();

在面临ElementNotVisibleError: element not visible异常时,可以添加一些ExplicitWait以使元素可见&然后单击如下所示:

代码语言:javascript
运行
复制
 WebElement myElement = (new WebDriverWait(driver, 15)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='button button--large ng-binding'][text()='Save']")));
 myElement.click();

如果这对你有帮助,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43775183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档