【问题标题】:How to find element via XPATH (already found it using console)如何通过 XPATH 查找元素(已使用控制台找到它)
【发布时间】:2021-08-25 15:25:47
【问题描述】:

我正在使用 Edge 浏览网页(但 Chrome 也可以),需要单击一个元素,这会删除一个菜单,然后在该菜单上选择一个项目。

Python 和 Selenium 在定位网站上的按钮时遇到问题。这是HTML screenshotconsole entry using the XPATH to find the element.

格式化我的 HTML 也给我带来了一些问题,但如果它有帮助的话就在这里:

<div id="ext-comp-1051-targetEl" class="x-box-target" role="presentation" style="width: 995px;"><a class="x-btn alloy-nav-item x-unselectable x-btn-toolbar x-box-item x-toolbar-item x-btn-plain-toolbar-small x-noicon x-btn-noicon x-btn-plain-toolbar-small-noicon" hidefocus="on" unselectable="on" tabindex="0" id="button-1054" style="margin: 0px; right: auto; left: 0px; top: 0px;"><span id="button-1054-btnWrap" role="presentation" class="x-btn-wrap x-btn-arrow x-btn-arrow-right" unselectable="on"><span id="button-1054-btnEl" class="x-btn-button" role="presentation"><span id="button-1054-btnInnerEl" class="x-btn-inner x-btn-inner-center" unselectable="on">Research</span><span role="presentation" id="button-1054-btnIconEl" class="x-btn-icon-el  " unselectable="on" style=""></span></span></span></a><a class="x-btn alloy-nav-item x-unselectable x-btn-toolbar x-box-item x-toolbar-item x-btn-plain-toolbar-small x-noicon x-btn-noicon x-btn-plain-toolbar-small-noicon" hidefocus="on" unselectable="on" tabindex="0" id="button-1064" style="margin: 0px; right: auto; left: 104px; top: 0px;"><span id="button-1064-btnWrap" role="presentation" class="x-btn-wrap x-btn-arrow x-btn-arrow-right" unselectable="on"><span id="button-1064-btnEl" class="x-btn-button" role="presentation"><span id="button-1064-btnInnerEl" class="x-btn-inner x-btn-inner-center" unselectable="on">FOT/ACATS</span><span role="presentation" id="button-1064-btnIconEl" class="x-btn-icon-el  " unselectable="on" style=""></span></span></span></a><a class="x-btn alloy-nav-item x-unselectable x-btn-toolbar x-box-item x-toolbar-item x-btn-plain-toolbar-small x-noicon x-btn-noicon x-btn-plain-toolbar-small-noicon" hidefocus="on" unselectable="on" tabindex="0" id="button-1070" style="margin: 0px; right: auto; left: 226px; top: 0px;"><span id="button-1070-btnWrap" role="presentation" class="x-btn-wrap x-btn-arrow x-btn-arrow-right" unselectable="on"><span id="button-1070-btnEl" class="x-btn-button" role="presentation"><span id="button-1070-btnInnerEl" class="x-btn-inner x-btn-inner-center" unselectable="on">Financials</span><span role="presentation" id="button-1070-btnIconEl" class="x-btn-icon-el  " unselectable="on" style=""></span></span></span></a><a class="x-btn alloy-nav-item x-unselectable x-btn-toolbar x-box-item x-toolbar-item x-btn-plain-toolbar-small x-noicon x-btn-noicon x-btn-plain-toolbar-small-noicon" hidefocus="on" unselectable="on" tabindex="0" id="button-1080" style="margin: 0px; right: auto; left: 334px; top: 0px;"><span id="button-1080-btnWrap" role="presentation" class="x-btn-wrap x-btn-arrow x-btn-arrow-right" unselectable="on"><span id="button-1080-btnEl" class="x-btn-button" role="presentation"><span id="button-1080-btnInnerEl" class="x-btn-inner x-btn-inner-center" unselectable="on">Reconciliation</span><span role="presentation" id="button-1080-btnIconEl" class="x-btn-icon-el  " unselectable="on" style=""></span></span></span></a><a class="x-btn alloy-nav-item x-unselectable x-btn-toolbar x-box-item x-toolbar-item x-btn-plain-toolbar-small x-noicon x-btn-noicon x-btn-plain-toolbar-small-noicon" hidefocus="on" unselectable="on" tabindex="0" id="button-1096" style="margin: 0px; right: auto; left: 466px; top: 0px;"><span id="button-1096-btnWrap" role="presentation" class="x-btn-wrap x-btn-arrow x-btn-arrow-right" unselectable="on"><span id="button-1096-btnEl" class="x-btn-button" role="presentation"><span id="button-1096-btnInnerEl" class="x-btn-inner x-btn-inner-center" unselectable="on">Maintenance</span><span role="presentation" id="button-1096-btnIconEl" class="x-btn-icon-el  " unselectable="on" style=""></span></span></span></a><a class="x-btn alloy-nav-item x-unselectable x-btn-toolbar x-box-item x-toolbar-item x-btn-plain-toolbar-small x-noicon x-btn-noicon x-btn-plain-toolbar-small-noicon" hidefocus="on" unselectable="on" tabindex="0" id="button-1103" style="margin: 0px; right: auto; left: 591px; top: 0px;"><span id="button-1103-btnWrap" role="presentation" class="x-btn-wrap x-btn-arrow x-btn-arrow-right" unselectable="on"><span id="button-1103-btnEl" class="x-btn-button" role="presentation"><span id="button-1103-btnInnerEl" class="x-btn-inner x-btn-inner-center" unselectable="on">Productivity Tools</span><span role="presentation" id="button-1103-btnIconEl" class="x-btn-icon-el  " unselectable="on" style=""></span></span></span></a><a class="x-btn alloy-nav-item x-unselectable x-btn-toolbar x-box-item x-toolbar-item x-btn-plain-toolbar-small x-noicon x-btn-noicon x-btn-plain-toolbar-small-noicon" hidefocus="on" unselectable="on" tabindex="0" id="button-1106" style="margin: 0px; right: auto; left: 744px; top: 0px;"><span id="button-1106-btnWrap" role="presentation" class="x-btn-wrap x-btn-arrow x-btn-arrow-right" unselectable="on"><span id="button-1106-btnEl" class="x-btn-button" role="presentation"><span id="button-1106-btnInnerEl" class="x-btn-inner x-btn-inner-center" unselectable="on">Admin</span><span role="presentation" id="button-1106-btnIconEl" class="x-btn-icon-el  " unselectable="on" style=""></span></span></span></a><div class="x-component x-box-item x-toolbar-item x-component-default" id="tbfill-1053" style="margin: 0px; right: auto; left: 828px; width: 125px; top: 13px;"></div><div class="x-component alloy-icon settings-btn x-box-item x-toolbar-item x-component-default" id="component-1116" style="right: auto; left: 961px; margin: 0px; top: 0px;"><i class=" alloy-icon-cog alloy-icon-lg alloy-icon-over"></i></div></div>

我试过按类、id、XPATH 等查找,但根本找不到。我也尝试过使用 Selenium 的 Select 和 By 模块。确认网站上没有 iframe 并且该元素存在(等待),并且我在 SO 和其他网站上查看了很多类似的问题。

这是我正在使用的代码(显然是两次单独的尝试):

driver.find_element_by_xpath("//span/div/div/div/div/a[4]")
driver.find_element_by_xpath("//*[@id='button-1080']")

我得到的错误:

NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//div/div/span/div/div/div/div/a[4]"}
  (Session info: MicrosoftEdge=91.0.864.41)
NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id='button-1080']"}
  (Session info: MicrosoftEdge=91.0.864.41)

由于网站和我的代码与工作相关,我有一些问题共享太多,但我很确定到目前为止的代码是正确的。

【问题讨论】:

  • 是不是等到元素存在才定位到:WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ext-comp-1051-targetEl")))
  • 是的。抱歉,这本来是很好的问题信息。已更新。
  • 你能分享一个指向那个网页的链接吗?
  • 先知 - 我无法分享链接。这是一个登录背后的供应商网站......对不起。

标签: python selenium xpath webautomation


【解决方案1】:

听起来你需要使用Explicit wait

如果Reconciliation你想click,我建议使用LINK_TEXTPARTIAL_LINK_TEXT

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT , 'Reconciliation')))
element.click()

进口:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

PS:

首先转到开发人员工具(按 F12),然后导航到元素部分并执行 CTRL+F,然后在搜索栏中搜索此 xpath //span[text()='Reconciliation'] 如果只有 1 个条目,那么您应该可以继续执行上述操作代码。

【讨论】:

  • 好吧……这太令人沮丧了。我正在等待找到该项目,但将其更改为 wait.until(EC.element_to_be_clickable(... ,效果很好。它总是很小的...谢谢!!!
猜你喜欢
  • 2020-05-03
  • 2022-07-05
  • 1970-01-01
  • 2010-12-08
  • 2021-05-07
  • 2020-07-20
  • 2016-03-12
  • 2017-09-14
  • 2014-08-07
相关资源
最近更新 更多