xpath tested and correct but i recieve the error : no such element: Unable to locate element
xpath tested and correct but i recieve the error : no such element: Unable to locate element
我的 Xpath 是正确的,没有 iFrame,我可以在 Chrome 控制台中找到元素,但我的程序仍然失败。我也使用过显式等待。
没有这样的元素:无法定位元素:{"method":"xpath","selector":"//*[contains(@ng-click,'authenticationCtrl.onSubmitMage()')]"}
我用 Try xpath 测试了我的 xpath,它可以工作,但是当我编译我的代码时,我仍然收到错误
页面对象:
package com.orange.pageObject;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.CacheLookup;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class MageReferentiel {
WebDriver webdriver;
public MageReferentiel(WebDriver rwebDriver) {
webdriver = rwebDriver;
PageFactory.initElements(webdriver, this);
}
@FindBy(xpath = "//*[contains(@ng-click,'authenticationCtrl.onSubmitMage()')]")
@CacheLookup
WebElement connexion;
public void clickConnexion() {
connexion.click();
}
步骤定义:
@When("l utilisateur choisi le referentiel")
public void l_utilisateur_choisi_le_referentiel() throws Exception {
mr.clickConnexion();
Thread.sleep(3000);
}
我想点击按钮
谢谢
我想 ng-click
属性值会在页面上动态更新,因此当您尝试访问该元素时,此元素已更改,没有它的初始状态。
而不是您使用的定位器试试这个 XPath:
//button[contains(text(),'Connexion')]
或这个
//button[@translate='LOGIN']
具有此定位器的第二个元素将是
(//button[@translate='LOGIN'])[2]
我同意@Prophet 的观点,可能是因为某些 JS 调用了按钮,//*[contains(@ng-click,'authenticationCtrl.onSubmitMage()')]
将其状态更改为其他状态。所以我们可以做的是,尝试使用不同的定位器。
如:
//button[@translate ='LOGIN']
看看是否可行,即使它不尝试将其更改为 css。
selenium 中默认的等待策略就是页面加载完成。
你有一个 angular 页面,所以在你的页面加载后有一个短暂的延迟,同时 JS 运行并且元素最终在 DOM 中准备好了 - 这个延迟导致你脚本失败。
在此处查看 selenium 文档以获得 wait strategies。
您的选择是:
- 显式等待 - 这需要为您需要同步的每个元素设置。
我注意到您说您使用了显式等待 - 但是在哪里? - 它不存在于您共享的代码中,可能是您使用了错误的预期条件。
尝试这样的事情:
WebElement button = new WebDriverWait(rwebDriver, Duration.ofSeconds(10))
.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(@ng-click,'authenticationCtrl.onSubmitMage()')]")));
button.click();
- 使用隐式等待 - 初始化驱动程序时只使用一次,它将等待指定的时间量以进行所有元素交互。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
selenium returns NoSuchElement 还有其他原因,但同步是最常见的原因。稍等一下,如果它仍然给您带来麻烦,请告诉我。
通过评论里的讨论,麻烦一个iframe
如果你 google 它 - 那里有很多答案。
对于框架,您需要识别它,切换到它,执行您的操作然后切换回来:
//find and switch - update the By.
driver.switchTo().frame(driver.findElement(By.id("your frame id")));
//actions go here
//back to normal
driver.switchTo().defaultContent();
因为 ng
元素在 Protractor (Angular) 中运行得很好,在这种情况下最好在 Protractor 中使用,所以它应该像 element(by.click('authenticationCtrl.onSubmitMage').click();
看起来元素没有按时呈现。尝试使用显式等待。以下 gif 显示了如何使用 Cucumber 完成:
https://nocodebdd.live/waitime-cucumber
同样是使用 NoCodeBDD 实现的:
https://nocodebdd.live/waittime-nocodebdd
免责声明:我是 NoCodeBDD 的创始人,因此无需代码即可在几分钟内实现 BDD 自动化。通过 NoCodeBDD,您可以自动化大多数场景,并且如果存在边缘情况,它允许您编写自己的代码。很想从社区获得一些关于产品的反馈。基础版(https://www.nocodebdd.com/download)免费使用
我的 Xpath 是正确的,没有 iFrame,我可以在 Chrome 控制台中找到元素,但我的程序仍然失败。我也使用过显式等待。
没有这样的元素:无法定位元素:{"method":"xpath","selector":"//*[contains(@ng-click,'authenticationCtrl.onSubmitMage()')]"}
我用 Try xpath 测试了我的 xpath,它可以工作,但是当我编译我的代码时,我仍然收到错误
页面对象:
package com.orange.pageObject;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.CacheLookup;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class MageReferentiel {
WebDriver webdriver;
public MageReferentiel(WebDriver rwebDriver) {
webdriver = rwebDriver;
PageFactory.initElements(webdriver, this);
}
@FindBy(xpath = "//*[contains(@ng-click,'authenticationCtrl.onSubmitMage()')]")
@CacheLookup
WebElement connexion;
public void clickConnexion() {
connexion.click();
}
步骤定义:
@When("l utilisateur choisi le referentiel")
public void l_utilisateur_choisi_le_referentiel() throws Exception {
mr.clickConnexion();
Thread.sleep(3000);
}
我想点击按钮
谢谢
我想 ng-click
属性值会在页面上动态更新,因此当您尝试访问该元素时,此元素已更改,没有它的初始状态。
而不是您使用的定位器试试这个 XPath:
//button[contains(text(),'Connexion')]
或这个
//button[@translate='LOGIN']
具有此定位器的第二个元素将是
(//button[@translate='LOGIN'])[2]
我同意@Prophet 的观点,可能是因为某些 JS 调用了按钮,//*[contains(@ng-click,'authenticationCtrl.onSubmitMage()')]
将其状态更改为其他状态。所以我们可以做的是,尝试使用不同的定位器。
如:
//button[@translate ='LOGIN']
看看是否可行,即使它不尝试将其更改为 css。
selenium 中默认的等待策略就是页面加载完成。
你有一个 angular 页面,所以在你的页面加载后有一个短暂的延迟,同时 JS 运行并且元素最终在 DOM 中准备好了 - 这个延迟导致你脚本失败。
在此处查看 selenium 文档以获得 wait strategies。
您的选择是:
- 显式等待 - 这需要为您需要同步的每个元素设置。
我注意到您说您使用了显式等待 - 但是在哪里? - 它不存在于您共享的代码中,可能是您使用了错误的预期条件。
尝试这样的事情:
WebElement button = new WebDriverWait(rwebDriver, Duration.ofSeconds(10))
.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(@ng-click,'authenticationCtrl.onSubmitMage()')]")));
button.click();
- 使用隐式等待 - 初始化驱动程序时只使用一次,它将等待指定的时间量以进行所有元素交互。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
selenium returns NoSuchElement 还有其他原因,但同步是最常见的原因。稍等一下,如果它仍然给您带来麻烦,请告诉我。
通过评论里的讨论,麻烦一个iframe
如果你 google 它 - 那里有很多答案。
对于框架,您需要识别它,切换到它,执行您的操作然后切换回来:
//find and switch - update the By.
driver.switchTo().frame(driver.findElement(By.id("your frame id")));
//actions go here
//back to normal
driver.switchTo().defaultContent();
因为 ng
元素在 Protractor (Angular) 中运行得很好,在这种情况下最好在 Protractor 中使用,所以它应该像 element(by.click('authenticationCtrl.onSubmitMage').click();
看起来元素没有按时呈现。尝试使用显式等待。以下 gif 显示了如何使用 Cucumber 完成:
https://nocodebdd.live/waitime-cucumber
同样是使用 NoCodeBDD 实现的: https://nocodebdd.live/waittime-nocodebdd
免责声明:我是 NoCodeBDD 的创始人,因此无需代码即可在几分钟内实现 BDD 自动化。通过 NoCodeBDD,您可以自动化大多数场景,并且如果存在边缘情况,它允许您编写自己的代码。很想从社区获得一些关于产品的反馈。基础版(https://www.nocodebdd.com/download)免费使用