【问题标题】:How to identify an element in selenium even if xpath is same即使xpath相同,如何识别硒中的元素
【发布时间】:2014-08-08 08:41:38
【问题描述】:

我是 selenium 的新手,正在尝试在 junit 框架中自动化 Web 应用程序。由于许多人在识别 Web 元素时遇到了一些问题,我也停留在两个提交按钮具有相同的 xpath 和 css 选择器的点上。

我能观察到的唯一区别是.. 在两个表单标签中,我可以看到 className 是不同的(第一个表单标签是"feature_space_checkbox",第二个表单标签是“auto_fs_steps_checkbox"

因为,我需要识别第二个提交按钮..所以我尝试识别第二个提交按钮,如下所示

driver.findElement(new ByChained(By.className("auto_fs_steps_checkbox"),By.xpath("//*[@id='edit_brochure_2863']/input[3]")));

当我尝试执行此操作时,我得到了错误

org.openqa.selenium.NoSuchElementException: Cannot locate an element using By.chained({By.className: auto_fs_steps_checkbox,By.xpath: //*[@id='edit_brochure_2863']/input[3]})

哪位大神可以指正一下我的错误

为这个场景添加 DOM

<form action="/brochures/2865/feature_space_checked" class="feature_space_checkbox" id="edit_brochure_2865" method="post"><div style="margin:0;padding:0">
    <input name="commit" type="submit" value="Submit">
  </form>

第二个提交按钮是..

<form action="/brochures/2865/update_auto_fs_steps" class="auto_fs_steps_checkbox" id="edit_brochure_2865" method="post"><div style="margin:0;padding:0">
    <input name="commit" type="submit" value="Submit">
  </form>

【问题讨论】:

    标签: java html selenium xpath


    【解决方案1】:

    首先,XPath 和 CSS 选择器不是确定的。页面上的每个元素都有很多 XPath 和 CSS,所以说它们具有相同的 Xpath 和 CSS 选择器是不正确的。

    对于您的示例,是否需要使用 XPath 或组合两个选择器?

    下面的 CSS 可以工作;

    form.auto_fs_steps_checkbox input
    

    【讨论】:

      【解决方案2】:

      没有必要使用链接,因为这都可以在 XPath 中表达:

      //*[@id='edit_brochure_2863' and @class='feature_space_checkbox']/input
      

      所以这将是 Java:

      driver.findElement(By.xpath("//*[@id='edit_brochure_2863' and @class='feature_space_checkbox']/input"));
      

      当然,第二个提交按钮是

      driver.findElement(By.xpath("//*[@id='edit_brochure_2863' and @class='auto_fs_steps_checkbox']/input"));
      

      【讨论】:

      • "Class=" 在 xpath 中总是有风险的,因为它将 class 视为文字字符串。与 CSS 选择器不同,如果向元素添加了额外的类,则 xpath 将不再起作用。甚至无法保证顺序,因此“class='foo bar”'可能会不稳定,因为它与“bar foo”不匹配。我总是会尝试使用 "contains(@class, "foo")",因为即使添加了一个类,它仍然可以工作
      • @RobbieWareham 您的警告肯定是正确和合理的。但是,我是故意这样做的,并且意识到了这个问题。 OP 清楚地指定了 XML,并且不存在其他类,因此对于这个 specific 问题它确实有效。
      • 是的,但是 HTML 通常是动态的,尤其是类,所以只是想指出另一种选择。顺便说一句,我对 XPath 没有任何问题,事实上我认为它经常被误解和恶意
      【解决方案3】:

      第二次提交的 xpath 将是

        driver.findElement(By.xpath("//form[@class='auto_fs_steps_checkbox']/input"));
      

      这足以识别第二个按钮,因为这里的类名是唯一的,并且两者的 id 相同。所以我们最好按类名来做。

      【讨论】:

        猜你喜欢
        • 2016-04-04
        • 1970-01-01
        • 2018-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-17
        • 1970-01-01
        • 2017-06-20
        相关资源
        最近更新 更多