我一直在尝试自动化我的工作,我们使用service-now来满足我们的请求。但是,对于我的生活,我无法让Selenium在现在的服务网站上正常运行。它在进入之前在登录页面上工作,但无论我使用哪种形式的定位器或 x 路径,它都不起作用。该网站是动态的,所以我非常确定需要xpath。
我已经直接从谷歌浏览器检查以及其他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')]
这是从铬复制的元素
<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>
有人可以查看我的代码吗?任何帮助将不胜感激!
我建议使用绝对 XPath,我想下面的注释会有所帮助
注意:- 如果你从 Firefox 复制 XPath,它主要会给你绝对的 XPath,而另一侧的 chrome 会给你相对的
或者另一种方法是使用 DOM 树中的另一个稳定元素制作 XPath
我希望这个锻炼对你有用。 如果您可以共享链接或检查显示完整 DOM 的元素快照,我可以为您提供更好的帮助。谢谢 :-(
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" )]
我不确定这是否会使其匹配(根据样本,它应该如此(,但会让你更接近。
谢谢你的所有回答。事实证明,我需要做的就是切换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' )]")
它成功了。
解决方案可能是从绝对 xpath(您在浏览器的开发人员工具中找到的路径:复制>复制 XPath(切换到相对路径。为此,您可以安装像SelectorsHub这样的扩展并查找"Rel XPath">
在一个特定的例子中,我发现绝对的xpath根本不起作用。