错误:使用Dynamic Xpath访问元素时出现元素不可见,而相对Xpath工作正常

时间:2017-05-04 06:15:11

标签: javascript node.js selenium xpath selenium-webdriver

我想点击“保存”按钮。保存按钮的Html:

<div class="button button--large ng-binding" ng-click="params.applyWrapper()">Save</div>

现在,当我使用相对xpath获取点击时,它可以正常工作。没有出现错误,单击此元素成功。

driver.findElement(webdriver.By.xpath(".//*[@id='navcontainer']/ons-page[4]/div[2]/div/ng-form/fieldset/ul/li[8]/div")).click();

但是,使用下面给出的动态xpath会产生错误“ElementNotVisibleError:element not visible”

driver.findElement(webdriver.By.xpath(".//div[contains(text(),'Save')]")).click();

可能是什么原因以及如何使用动态xpath点击此元素?

2 个答案:

答案 0 :(得分:0)

正如你所提到的,这个绝对的xpath有效:

driver.findElement(webdriver.By.xpath(".//*[@id='navcontainer']/ons-page[4]/div[2]/div/ng-form/fieldset/ul/li[8]/div")).click();

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

driver.findElement(webdriver.By.xpath("//div[@class='button button--large ng-binding'][text()='Save']")).click();

当您面临ElementNotVisibleError: element not visible例外情况时,您可以为要显示的元素添加一些ExplicitWait&amp;然后点击如下:

 WebElement myElement = (new WebDriverWait(driver, 15)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='button button--large ng-binding'][text()='Save']")));
 myElement.click();

如果这有助于您,请告诉我。

答案 1 :(得分:0)

解释为什么Element出现不可见错误的原因是前一页还有一个'Save'按钮,因为在大多数实现中我们不会破坏前一页并只隐藏它,webdriver正在找到之前的Save按钮页面但无法访问它,因为它被隐藏,因此错误元素不可见。 使用绝对xpath有效地区分了前一页和当前页上的Save按钮,而“Save”按钮的Dynamic xpath完全相同。 (假设没有使xpath不同的属性。)

driver.findElement(By.xpath("//*[text()='Save']")).click();

现在,我们需要一种方法来使“保存”按钮的动态xpath不同。 这可以通过使用 Xpath轴方法来完成。在此方法中,我们标识要访问的元素之前或之后的元素,并针对此前/后元素写入xpath。

在我的情况下,当前页面上的“保存”按钮前面有一个输入标记,前一页上的“保存”按钮前面有一个span标记。这允许我区分这两个按钮的xpath,如下所示:

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

driver.findElement(By.xpath("//input[@name='defaults']//following::div[1]")).click();
此ppath中的

// following :: div [1] 表示“保存”按钮,前面是输入标记。

上一页的保存按钮的Xpath:

driver.findElement(By.xpath("//span[text()='Test']//following::div[1]")).click();
此ppath中的

// following :: div [1] 表示“保存”按钮,前面是span标记。