【问题标题】:Protractor can find element but using .click(); causes it to not be found量角器可以找到元素,但使用 .click();导致找不到
【发布时间】:2026-02-12 04:45:01
【问题描述】:

我有一个问题,如果我使用 .isPresent(); 可以让我的 xpath 在测试脚本上显示零错误;验证元素是否在页面上,但如果我使用“click”命令代替,我会收到错误指示无法找到 xpath。 xpath 在这里起作用:

element(by.xpath('//*[@id="layout-padding"]/ui-view/layout-authen/ui-view/div/div[2]/scroll-detector/settings-section[8]/div[1]/a/i')).isPresent();

这里是xpath

element(by.xpath('//*[@id="layout-padding"]/ui-view/layout-authen/ui-view/div/div[2]/scroll-detector/settings-section[8]/div[1]/a/i')).click();

结果

失败:使用定位器找不到元素:By(xpath, //*[@id="layout-padding"]/ui-view/layout-authen/ui-view/div/div[2]/scroll-检测器/settings-section[8]/div[1]/a/i)

element(by.xpath('.//*[.="TextIWant"]')).isPresent();isPresent() 一样,搜索文本的相对 xpath(这可能更安全,因为未来的更改会破坏它),但在 .click() 时失败。

我尝试了不同的 xpath 工具(在 Chrome 和 Firefox 中加上一个附加组件)来检查 xpath,但结果是一样的。为什么点击它时可以找到元素但错误?该脚本在到达这一点之前找到并单击其他一些元素。我需要做什么才能让它点击它显然可以找到的元素?

这是我复制的元素:

div class="header"

a href="" class="toggle-bt ng-binding" ng-click="view.showContent = !view.showContent"
    i class="fa fa-angle-right" ng-class="view.showContent ? 'fa-angle-down' : 'fa-angle-right'" style=""></i>
    TextIWant
</a>

<div class="description ng-binding">
    Settings for the TextIWant
</div>
</div>

【问题讨论】:

  • 提供相关链接或HTML代码
  • 您是否尝试添加等待元素可点击?如果您使用的 XPath 在当前和单击情况下实际上是相同的,那么您不应该收到此错误,除非它是时间问题。到页面的链接会有很大帮助。
  • 当您说 isPresent “有效”时,这意味着它不会抛出错误,或者如果您期望它是真实的或真实的,它是?
  • 我添加了元素的代码sn-p。通过 isPresent 工作,我的意思是它不会引发错误。我确实尝试在 isPresent 和 .click(); 之间等待更长的时间;尝试,但我仍然收到错误,表明单击命令未找到它。
  • 我不知道这个问题,但对我来说有时它有助于使用:browser.actions().mouseMove(myElement).perform(); browser.actions().click(myElement).perform(); 例如,单击svg 绘制的元素对我不起作用。

标签: angular selenium-webdriver xpath protractor


【解决方案1】:

请尝试以下方法

driver.findElement(By.cssSelector("div.header div.description"))).isPresent(); driver.findElement(By.cssSelector("div.header div.description"))).click();

请参阅下面有关 css 选择器的更多信息 http://www.seleniumeasy.com/selenium-tutorials/css-selectors-tutorial-for-selenium-with-examples

【讨论】:

    【解决方案2】:

    当您尝试单击某个元素时,它可能无法单击。试试这个:

    var EC = protractor.ExpectedConditions;
    var elm = element(by.xpath('//*[@id="layout-padding"]/ui-view/layout-authen/ui-view/div/div[2]/scroll-detector/settings-section[8]/div[1]/a/i'));
    browser.wait(EC.elementToBeClickable(element(by.xpath('//*[@id="layout-padding"]/ui-view/layout-authen/ui-view/div/div[2]/scroll-detector/settings-section[8]/div[1]/a/i'))), 30000, "Element is not clickable").then(function() {
       elm.click();
    });
    

    【讨论】:

    • 失败:未知错误:元素 在点 (362, 660) 处不可点击。其他元素会收到点击: (会话信息: chrome=67.0.3396.99) (驱动程序信息: chromedriver=2.40.565386 (45a059dc425e08165f9a10324bd1380cc13ca363),platform=Mac OS X 10.13.3 x86_64)跨度>
    • 这就是进步。 (大概你试图点击的东西是不可见的,因此需要滚动)它现在正在寻找元素,但是当内部有输入时,Protractor 可能会对点击 div 或其他东西感到挑剔。有时我会放弃并使用 executeScript 来否决它来进行点击,但这很丑陋。如果您使用@Sanja Paskova 的代码,但将她的定位器替换为您正在考虑的 by.xpath('.//*[.="TextIWant"]' 是否有帮助?我想知道这是否可能更精确点击你想要的部分。
    • 感谢大家的意见和帮助。我能够让测试达到通过但有点不稳定的状态,所以我确实认为(除了更改一些选择器之外)时间也是一个因素;测试进行得非常快(一件好事),但我确实看到了一些滞后;这些在应用程序中有所不同。
    • 我读过的关于量角器的所有内容(到目前为止......我的自动化经验是不同的工具)表明它内置了等待/睡眠以避免添加这些,我的测试没有通过所有这些都无需在屏幕之间添加一些。在过去的角色中,时间安排是必须通过反复试验来解决的,但我看到一个部分失败最多,在一次失败的测试运行中,量角器似乎点击了错误的元素。
    【解决方案3】:

    尝试使用等待和 javascript 执行器:

     var elm = element(by.xpath('//*[@id="layout-padding"]/ui-view/layout-authen/ui-view/div/div[2]/scroll-detector/settings-section[8]/div[1]/a/i'));
    browser.wait(EC.elementToBeClickable(element(by.xpath('//*[@id="layout-padding"]/ui-view/layout-authen/ui-view/div/div[2]/scroll-detector/settings-section[8]/div[1]/a/i'))), 30000, "Element is not clickable").then(function() {
       browser.executeScript('arguments[0].click()', elm);
    });
    

    【讨论】: