我想点击“保存”按钮。保存按钮的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点击此元素?
答案 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标记。