【问题标题】:XPath is not working even when directly copied from Chrome inspect即使直接从 Chrome 检查中复制,XPath 也不起作用
【发布时间】:2019-12-04 08:41:42
【问题描述】:

我一直在尝试自动化我的工作,我们使用 service-now 来处理我们的请求。但是,对于我的一生,我无法让 Selenium 在 service-now 网站上正常运行。它在进入之前在登录页面上工作,但无论我使用什么形式的定位器或 x 路径它都不起作用。该网站是动态的,所以我很确定需要 xpath。

我已经直接从 Google Chrome 检查以及其他 xpath 可能性进行了尝试:

//*[@id="row_sc_request.sc_task.request_65091fb5db8163c4bc8f18df4b961921"]/td[3]/a

xpath=//a[starts-with(text(),'Open record: SCTA')]

xpath=//a[class="linked formlink" and starts-with(@aria-label='Open record: SCTA')]

这是从chrome复制的元素

<a class="linked formlink" aria-label="Open record: SCTASK0067185" href="sc\\\_task.do?sys\\\_id=65091fb5db8163c4bc8f18df4b961921\\\&sysparm\\\_record\\\_target=sc\\\_task\\\&sysparm\\\_record\\\_row=1\\\&sysparm\\\_record\\\_rows=1\\\&sysparm\\\_record\\\_list=request%3D9509dbb5db8163c4bc8f18df4b96199f%5EORDERBYDESCnumber">SCTASK0067185</a>

有人可以检查我的代码吗?任何帮助将不胜感激!

【问题讨论】:

  • 你检查过元素是否在 iframe 中吗?

标签: python-3.x selenium xpath selenium-chromedriver servicenow


【解决方案1】:

在第二个 xpath 中存在语法错误,这个 - xpath=//a[class="linked formlink" and starts-with(aria-label='SCTA')]。 在 xpath 中,属性必须以“@”字符为前缀; starts-with() 接受两个参数,而不是布尔值。所以一定是:

xpath=//a[@class="linked formlink" and starts-with(@aria-label, "SCTA" )]

我不确定这是否会匹配(根据示例,它应该会匹配),但会让您更接近。

【讨论】:

  • 谢谢,这肯定是朝着正确方向迈出的一步。但它仍然无法正常工作。我一直在使用 Selenium IDE 对其进行测试,但没有运气。
  • 在浏览器本身中测试 xpath - 打开开发工具,并在控制台中使用 $x() 方法和您的值;例如$x('//a[@class="linked formlink" and starts-with(@aria-label, "SCTA" )]')。这比在任何框架(包括 selenium IDE)中启动案例要快几倍。
  • 这样快多了,谢谢!它显示在浏览器控制台中并返回它是一个链接。但是,当请求单击它时,它仍然没有正确显示。它现在声明“结果不是节点集,因此无法转换为所需的类型。”
  • 你用什么python方法来获取元素?
  • selenium IDE 在处理这种动态链接方面存在限制,这就是为什么它不起作用的原因,而是使用 selenium Web 驱动程序并编写动态代码来处理。
【解决方案2】:

我会建议使用绝对 XPath,我想下面的注释会有所帮助

注意:- 如果您从 Firefox 复制 XPath,它将主要为您提供绝对 XPath,而另一侧的 chrome 将提供相对路径

或者另一种方法是使用 DOM 树中的另一个稳定元素创建 XPath

我希望这个锻炼适合你。如果您可以共享链接或检查显示完整 DOM 的元素快照,我可以为您提供更好的帮助。谢谢:-)

【讨论】:

    【解决方案3】:

    感谢您的所有回答。事实证明,我需要做的就是切换 IFrame。 我对此很陌生,所以我不知道。

    在我的情况下,我不得不写:

    "browser.switch_to.frame(browser.find_element_by_name('gsft_main'))"
    

    其中 gsft_main 是框架的名称。

    这样做之后,我就可以使用了:

    browser.find_element_by_xpath("//a[@class='linked formlink' and starts-with(@aria-label, 'Open record: SCTA' )]")
    

    它成功了。

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2023-03-06
      • 2020-06-03
      • 2018-07-24
      • 1970-01-01
      • 2013-06-01
      • 2022-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多