2017-05-04 83 views
0

我试图在保存按钮上单击一下。 Html的保存按钮:错误:使用动态Xpath访问元素时,元素不可见,而相对Xpath正常工作

<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:元素不可见”

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

可能是这个原因,我如何使用动态的XPath获得点击这个元素是什么?

+0

使用显式等待按钮可见并尝试。可能有这样的机会,你的第一个xpath定位父节点so element中的元素,但是在你的动态xpath中,它正在从该节点本身定位元素所以它是不可见的,因为它可能需要时间才能看到 – NarendraR

+0

嗨@NarendraRajput ..根据你的建议,我试着找到第一个元素,然后等待它是可见的,如下所示'var button = driver.wait(webdriver.until.elementLocated(webdriver.By.xpath(“// div [contains(文本(), '保存')“))); driver.wait(until.elementIsVisible(button))。click();'等待是无限的。驱动程序继续等待元素可见。使用绝对Xpath,它没有时间访问元素。有些东西是可疑的。 –

+0

你在哪里添加了在这段代码中等待的时间? – kushal

回答

0

解释为什么元素不可见错误出现了,前一页也有一个'保存'按钮,因为在大多数实现中,我们不销毁前一页,只隐藏它,webdriver找到保存按钮上一页但由于它隐藏而无法访问它,因此错误元素不可见。 使用绝对xpath有效地区别前一页和当前页面上的保存按钮,而“保存”按钮的动态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(); 

//以下:: DIV [1]在这个XPath代表'保存'按钮之前是一个输​​入标签。

的Xpath对前一页上的保存按钮:

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

//以下:: DIV [1]在此XPath代表被一个范围标记前面加上 '保存' 按钮。

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 &然后点击如下:

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

让我知道这是否对你有帮助。

+0

同样的错误“ElementNotVisibleError:元素不可见”。 –

+0

@PawanJuyal更新了我的答案。让我知道状态。谢谢 – DebanjanB

+0

我没有用wait来检查这个元素的可见性。没有工作。我发现安德森在这个问题上的分析是有效的。该元素存在于上一页以及当前页面上,并且驱动程序必须与当前隐藏的页面上的元素进行交互。这就是为什么我得到这个错误。现在问题是如何访问当前页面上的这个元素。 –