Javascript 错误:使用动态Xpath访问元素时,当相对Xpath正常工作时,会出现元素不可见

Javascript 错误:使用动态Xpath访问元素时,当相对Xpath正常工作时,会出现元素不可见,javascript,node.js,selenium,xpath,selenium-webdriver,Javascript,Node.js,Selenium,Xpath,Selenium Webdriver,我正试图点击一个保存按钮。保存按钮的Html格式: <div class="button button--large ng-binding" ng-click="params.applyWrapper()">Save</div> 但是,使用下面给出的动态xpath会产生一个错误“ElementNotVisibleError:element不可见” 原因可能是什么?我如何使用动态xpath单击此元素?正如您提到的,此绝对xpath有效: driver.findElemen

我正试图点击一个保存按钮。保存按钮的Html格式:

<div class="button button--large ng-binding" ng-click="params.applyWrapper()">Save</div>
但是,使用下面给出的动态xpath会产生一个错误“ElementNotVisibleError:element不可见”


原因可能是什么?我如何使用动态xpath单击此元素?

正如您提到的,此绝对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();

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

关于出现Element not visible错误的原因的解释是,上一页也有一个“Save”(保存)按钮,因为在大多数实现中,我们不会破坏上一页,只会将其隐藏,webdriver在上一页上找到了“保存”按钮,但无法访问它,因为它是隐藏的,因此错误元素不可见。 使用绝对xpath可以有效地区别上一页和当前页上的保存按钮,而“保存”按钮的动态xpath完全相同。(假设没有使xpath不同的属性。)

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

在我的例子中,当前页面上的“保存”按钮前面有一个输入标记,而上一页上的“保存”按钮前面有一个span标记。这使我能够区分这两个按钮的xpath,如下所示:

 WebElement myElement = (new WebDriverWait(driver, 15)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='button button--large ng-binding'][text()='Save']")));
 myElement.click();
当前页面上保存按钮的Xpath:

driver.findElement(By.xpath("//input[@name='defaults']//following::div[1]")).click();
driver.findElement(By.xpath("//span[text()='Test']//following::div[1]")).click();
//此xpath中的following::div[1]表示“保存”按钮,该按钮前面有一个输入标记

上一页保存按钮的Xpath:

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

//此xpath中的following::div[1]表示“保存”按钮,该按钮前面有一个span标记。

使用显式等待按钮可见,然后重试。有可能是您的第一个xpath从父节点定位元素,因此元素被定位,但在动态xpath中,它是从该节点本身定位元素,因此元素不可见,因为获取visibleHi@narendrajput可能需要时间。。根据您的建议,我尝试先定位元素,然后等待它可见,如下所示
var button=driver.wait(webdriver.until.elementLocated(webdriver.By.xpath(//div[contains(text(),'Save')]);等待(直到.element可见(按钮))。单击()等待是无限的。驱动程序继续等待元素可见。使用绝对Xpath访问元素不需要时间。有些可疑。您在代码中添加等待时间的位置?初始代码是
var button=driver.wait(webdriver.until.elementLocated(webdriver.By.xpat‌​h(“//div[contains(te‌​xt(),'Save')]>),5000);等待(直到.elementIsVisible(按钮),10000)。单击()这将导致超时。元素仍然不可见。我删除了代码中的时间来检查超时限制,但它一直在继续。相同的错误“ElementNotVisibleError:element not visible”。@PawanJuyal更新了我的答案。让我知道情况。ThanksI确实使用了wait来检查此元素的可见性。没用。我认为安德森对这个问题的分析是正确的。此元素存在于上一页和当前页上,并且驱动程序必须与当前隐藏页上的驱动程序交互。这就是为什么我会犯这个错误。现在的问题是如何访问当前页面上的这个元素。@PawanJuyal我看不到您在前面的注释中以编程方式正确定义了
wait
。你试过我最后的建议了吗?更新我的状态。谢谢,我正在使用selenium和Javascript,即webdriverjs节点模块。下面给出了我用来等待元素可见的代码
var myElement=driver.findElement(webdriver.By.xpath(“//*[text()='Save']”);等待(直到.element可见(myElement),15000)。单击()这是得到的结果:TimeoutError:等待直到元素可见等待在15004ms后超时