【问题标题】:xpath tested and correct but i recieve the error : no such element: Unable to locate elementxpath 测试并正确,但我收到错误:没有这样的元素:无法找到元素
【发布时间】:2021-07-13 15:04:40
【问题描述】:

我的 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);
    }

我想点击按钮

谢谢

【问题讨论】:

    标签: java selenium xpath webdriver


    【解决方案1】:

    我同意@Prophet,这可能是因为一些 JS 调用了按钮,//*[contains(@ng-click,'authenticationCtrl.onSubmitMage()')] 将其状态更改为其他状态。所以我们可以做的是,尝试使用不同的定位器。

    如:

    //button[@translate ='LOGIN']
    

    看看这是否有效,即使它没有尝试将其更改为 css。

    【讨论】:

    • 实际上我有两个面板,每个面板都有相同的文本名称和属性,每个都代表一个应用程序,但要访问第二个面板,您必须单击第二个连接按钮才能转到主页之后我将开始对表单进行测试
    • //button[@translate ='LOGIN'] 它对我不起作用,但 xpath (//button[contains(text(),'Connexion')])[2] 它只在我的 Eclipse 中使用 devtools 我有同样的错误
    【解决方案2】:

    由于 ng 元素与 Protractor (Angular) 配合得很好,在这种情况下最好在 Protractor 中使用,所以它应该类似于 element(by.click('authenticationCtrl.onSubmitMage').click();

    【讨论】:

    • 你能解释一下什么是“元素”吗?
    • @jerando element 就像 driver find 一样,因为它是有角度的,所以有特殊的定位器
    【解决方案3】:

    我猜ng-click 属性值会在页面上动态更新,因此当您尝试访问该元素时,此元素会发生更改,而不是初始状态。
    而不是你正在使用的定位器,试试这个 XPath:

    //button[contains(text(),'Connexion')]
    

    或者这个

    //button[@translate='LOGIN']
    

    具有此定位器的第二个元素将是

    (//button[@translate='LOGIN'])[2]
    

    【讨论】:

    • 那我该怎么办?
    • 但问题是我有两个按钮具有相同的文本'Connexion',然后我尝试添加相同的属性,例如添加按钮的索引 //button[contains(text(),'Connexion ')][1] 但它不起作用,谢谢
    • org.openqa.selenium.NoSuchElementException:没有这样的元素:无法找到元素:{"method":"xpath","selector":"(//button[@translate='LOGIN' ])[2]"}
    • (//button[contains(text(),'Connexion')])[2] 是怎么回事?
    • 是的,先生,这是我尝试过的 xpath (//button[contains(text(),'Connexion')])[2]
    【解决方案4】:

    看起来元素没有按时呈现。尝试使用显式等待。以下 gif 显示了如何使用 Cucumber 完成:

    https://nocodebdd.live/waitime-cucumber

    同样使用 NoCodeBDD 实现: https://nocodebdd.live/waittime-nocodebdd

    免责声明:我是 NoCodeBDD 的创始人,因此无需代码即可在几分钟内实现 BDD 自动化。通过 NoCodeBDD,您可以自动化大多数场景,如果有边缘情况,它允许您编写自己的代码。希望从社区中获得有关产品的一些反馈。基本版 (https://www.nocodebdd.com/download) 可免费使用。

    【讨论】:

    • NoCodeBDD 软件如何帮助我解决问题?
    • NoCodeBDD 默认有明确的等待时间。但是根据渲染速度,您可以在不使用代码的情况下添加等待时间。正如我在帖子中提到的,同样的事情可以使用 Cucumber 来完成。
    • 它对我不起作用我有这个错误预期条件失败:等待元素可点击:By.xpath: //*[contains(@ng-click,'authenticationCtrl.onSubmitMage( )')]
    【解决方案5】:

    selenium 中默认的等待策略就是页面加载完毕。

    你有一个角页面,所以在你的页面加载之后,在 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 返回 NoSuchElement 还有其他原因,但同步是最常见的原因。稍等一下,如果它仍然给您带来麻烦,请告诉我。


    通过cmets中的讨论,麻烦的是iframe

    如果你用谷歌搜索 - 那里有很多答案。

    使用框架,您需要识别它,切换到它,执行您的操作,然后切换回来:

    //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();
    

    【讨论】:

    • 我做了两个步骤,我有这个错误:预期条件失败:等待元素可点击:By.xpath://* [包含(@ng-click,'authenticationCtrl.onSubmitMage() ')](尝试 10 秒,间隔 500 毫秒)
    • 还有这个错误:没有这样的元素:无法找到元素:{"method":"xpath","selector":"//*[contains(@ng-click,'authenticationCtrl. onSubmitMage()')]"}
    • @jerando 接下来要检查的是站点是否正在分页 - 由于测试失败,您的元素在页面上是否可用?您需要将其滚动到视图中吗? - 如果您手动检查 devtools,您可能会在没有意识到的情况下这样做。您需要做的是在失败的行上添加一个断点,并在与 DOM 进行任何交互之前知道它失败时的状态。
    • 是的,先生,确实有很多 div,我的网站正在分页。好的,我会尽力做到这一点,我会随时通知您。谢谢
    • 您好,在添加断点并按照您的说明操作后,问题出在函数 clickConnexion() 上,但我不知道如何解决它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多