为什么即使我从浏览器复制 selenium 也找不到 XPath?

Why can't selenium find XPath even though I copied it from the browser?

我很难单击特定的 link。我尝试使用 find_element_by_css_selectorfind_element_by_xpath。两者都给我以下错误,即使我从浏览器复制了 xpath。我想也许我需要等待页面加载,所以我添加了一个 30 秒的计时器,但它仍然找不到该元素。非常感谢任何帮助。

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id='ctl00_cphMain_RadDock1455_C_ctl00_gridTimesheets_ctl00__0']/td[2]/a"}

HTML:

代码:

time.sleep(30)

link = driver.find_element_by_xpath("//*[@id='ctl00_cphMain_RadDock1455_C_ctl00_gridTimesheets_ctl00__0']/td[2]/a")
link.click()

尝试:

time.sleep(30)

link = driver.find_element_by_xpath("//a[@title='Data Analyst']")
link.click()

您在 xpath ctl00_cphMain_RadDock1455_C_ctl00_gridTimesheets_ctl00__0' 中使用的 ID 本质上可能是动态的,这意味着在 运行 时某些值可能会发生变化,您可能会得到 NoSuchElement exception

您可以使用 link_textpartial_link_text,以防 Data Analyst 是包含在 anchor tag 中的唯一文本。

driver.find_element(By.LINK_TEXT, "Data Analyst").click()

一般来说应该可以,但是如果您正在寻找可靠的解决方案,您应该进行显式等待:

wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Data Analyst"))).click()

您必须在下面导入:

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

如果您正在寻找 xpath-based locator,您可以使用

//tr[@class='rgRow']//td[2]/a[@title='Data Analyst' and text()='Data Analyst']

您只需确保它在本质上应该是独一无二的。

检查步骤:

Press F12 in Chrome -> 转到 element 部分 -> 执行 CTRL + F -> 然后粘贴 xpath 并查看是否需要 element正在 突出显示 1/1 匹配节点。

更新:

NoSuchElementException:

请检查 dev tools (Google chrome) 我们是否在 HTML-DOM 中有 unique 条目。

您应该检查的 xpath :

//tr[@class='rgRow']//td[2]/a[@title='Data Analyst' and text()='Data Analyst']

检查步骤:

Press F12 in Chrome -> 转到 element 部分 -> 执行 CTRL + F -> 然后粘贴 xpath 并查看是否需要 element正在 突出显示 1/1 匹配节点。

如果这是唯一的 //tr[@class='rgRow']//td[2]/a[@title='Data Analyst' and text()='Data Analyst'] 那么您还需要检查以下条件。

  1. 检查它是否在任何 iframe/frame/frameset.

    解决方法:先切换到iframe/frame/frameset,再与该网页元素交互

  2. 检查它是否在任何 shadow-root.

    解决方法:使用driver.execute_script('return document.querySelector返回一个web元素,然后进行相应的操作。

  3. 确保在与元素交互之前正确呈现该元素。放一些 hardcoded delayExplicit wait 然后再试一次。

    解决方法: time.sleep(5) 或者

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//tr[@class='rgRow']//td[2]/a[@title='Data Analyst' and text()='Data Analyst']"))).send_keys("test")

  4. 如果您已重定向到 new tab/ or new windows 而您还没有 切换 到那个特定的 new tab/new window,否则您可能会得到NoSuchElement异常。

    解决方法:先切换到相关window/tab

  5. 如果您已切换到 iframe 并且新的所需元素不在同一 iframe 上下文中,那么首先 switch to default content 然后与其交互。

    解决方法:切换到默认内容,然后切换到各自的iframe。