NoSuchElementException:没有这样的元素:无法定位元素

NoSuchElementException: no such element: Unable to locate element

免责声明:我将在十多年后重新开始编写脚本,因此对于这样一个基本问题提前表示歉意,但非常需要和感谢帮助。

我最近试图找到脚本来自动寻找工作,为此我找到了一个脚本,可以帮助我登录到工作门户并申请符合我条件的工作。

但我认为脚本没有更新,因为我在 运行 时遇到错误:

NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="root"]/div[2]/div[2]/div/form/div[2]/input"} (Session info: chrome=98.0.4758.109)

我认为这与以下代码行有关:

driver.get("https://www.naukri.com")
driver.find_element_by_xpath('//*[@id="login_Layer"]/div').click()
time.sleep(5)
driver.find_element_by_xpath('//*[@id="root"]/div[2]/div[2]/div/form/div[2]/input').send_keys("YOUR NAUKRI LOGIN ID")
driver.find_element_by_xpath('//*[@id="root"]/div[2]/div[2]/div/form/div[3]/input').send_keys("YOUR NAUKRI PASSWORD")
time.sleep(5)
driver.find_element_by_xpath('//*[@id="root"]/div[2]/div[2]/div/form/div[6]/button').click()

脚本能够转到 Naukri.com(工作门户)并找到 login_Layer ID 的路径,这会打开登录侧边栏。但是它无法找到用户名和密码字段。可能是网页变了。

我正在尝试检查页面元素并找到正确的 xpath,但没有成功。再一次,十多年来没有接触过 XML/HTML 或任何类型的 Web 开发(一开始是新手),所以觉得很难。

非常感谢任何指导或帮助。

期待您的回答。

提前致谢!

是的,您的 XPath 已过时。

如果您使用的是 chromium 浏览器,请右键单击您想要 XPath 的元素,然后单击检查。如果您的 DevTools 尚未打开,请执行两次。然后它会在页面源代码中突出显示您的元素。之后右键单击突出显示的元素、复制和“复制 XPath”以更新您的脚本。

driver.find_element_by_xpath('//*[@id="root"]/div[2]/div[2]/div/form/div[2]/input').send_keys("YOUR NAUKRI LOGIN ID")

此语法应该仍然有效,但现代指南希望您使用此语法:

from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, '//*[@id="root"]/div[3]/div[2]/div/form/div[2]/input').send_keys("YOUR NAUKRI LOGIN ID")
wait=WebDriverWait(driver,20)
driver.get("https://www.naukri.com")

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#login_Layer > div'))).click()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'form > div:nth-child(2) > input'))).send_keys("user")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'form > div:nth-child(3) > input'))).send_keys("pw")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'button.btn-primary.loginButton'))).click()

您想使用 webdriver 等待并切换您的 xpaths。

进口:

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

您的 XPATH 实际上是不正确的。

我建议您尽可能编写最具弹性的 XPath,因为 XPath 越长,它变得越脆弱。让 XPath 基于大的 HTML 标签层次结构通常不是一个好主意,因为如果在它们之间引入新的标签(一个新的 div 标签)它就会中断。我相信这个应用程序也发生了什么。

为避免这种情况,您可以使用下面的 xpaths。

driver.find_element_by_xpath("//label[text()='Email ID / Username']/../input").send_keys("YOUR NAUKRI LOGIN ID")

driver.find_element_by_xpath("//label[text()='Password']/../input").send_keys("YOUR NAUKRI PASSWORD")