为什么即使我从浏览器复制 selenium 也找不到 XPath?
Why can't selenium find XPath even though I copied it from the browser?
我很难单击特定的 link。我尝试使用 find_element_by_css_selector
和 find_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_text
或 partial_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']
那么您还需要检查以下条件。
检查它是否在任何 iframe/frame/frameset
.
解决方法:先切换到iframe/frame/frameset,再与该网页元素交互
检查它是否在任何 shadow-root
.
解决方法:使用driver.execute_script('return document.querySelector
返回一个web元素,然后进行相应的操作。
确保在与元素交互之前正确呈现该元素。放一些 hardcoded delay
或 Explicit 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")
如果您已重定向到 new tab/ or new windows
而您还没有 切换 到那个特定的 new tab/new window
,否则您可能会得到NoSuchElement
异常。
解决方法:先切换到相关window/tab
如果您已切换到 iframe 并且新的所需元素不在同一 iframe 上下文中,那么首先 switch to default content
然后与其交互。
解决方法:切换到默认内容,然后切换到各自的iframe。
我很难单击特定的 link。我尝试使用 find_element_by_css_selector
和 find_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_text
或 partial_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']
那么您还需要检查以下条件。
检查它是否在任何
iframe/frame/frameset
.解决方法:先切换到iframe/frame/frameset,再与该网页元素交互
检查它是否在任何
shadow-root
.解决方法:使用
driver.execute_script('return document.querySelector
返回一个web元素,然后进行相应的操作。确保在与元素交互之前正确呈现该元素。放一些
hardcoded delay
或Explicit 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")
如果您已重定向到
new tab/ or new windows
而您还没有 切换 到那个特定的new tab/new window
,否则您可能会得到NoSuchElement
异常。解决方法:先切换到相关window/tab
如果您已切换到 iframe 并且新的所需元素不在同一 iframe 上下文中,那么首先
switch to default content
然后与其交互。解决方法:切换到默认内容,然后切换到各自的iframe。