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

您的选择是:

  1. 显式等待 - 这需要为您需要同步的每个元素设置。

我注意到您说您使用了显式等待 - 但是在哪里? - 它不存在于您共享的代码中,可能是您使用了错误的预期条件。

尝试这样的事情:

WebElement button = new WebDriverWait(rwebDriver, Duration.ofSeconds(10))
        .until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(@ng-click,'authenticationCtrl.onSubmitMage()')]")));
button.click();
  1. 使用隐式等待 - 初始化驱动程序时只使用一次,它将等待指定的时间量以进行所有元素交互。
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)免费使用