【问题标题】:Unable to locate element by xpath using Selenium with Python无法通过 xpath 使用 Selenium 和 Python 定位元素
【发布时间】:2020-10-16 21:51:19
【问题描述】:

我正在用 Python 创建一个 Selenium 机器人。驱动程序应该打开 instagram.com 并使用用户凭据作为输入填写登录表单。有一个错误:

# FIRST I OPEN INSTAGRAM LIKE THIS
self.driver.get("https://www.instagram.com/")

# THEN A POP-UP APPEARS, AND I CLOSE IT BY CLICKING IN THE ACCEPT BUTTON,
# IT SEEMS LIKE IT IS NOT AN IFRAME SO NO FRAME SWITCHES ARE NEEDED
cooki = self.driver.find_element_by_xpath('/html/body/div[2]/div/div/div/div[2]/button[1]')
cooki.click() 
 
# NOW I TRY TO FIND THE USERNAME FORM TO WRITE IN AN INPUT
usbar = self.driver.find_element_by_xpath('//*[@id="loginForm"]/div/div[1]')    # ERROR HERE
usbar.send_keys(input('Username: '))

错误提示:

NoSuchElementException: 没有这样的元素: 无法定位元素: {"method":"xpath","selector":"//*[@id="loginForm"]/div/div[1]"}

它找不到要写入的用户名表单。我相信路上没有 iframe,我不知道是否还有其他问题阻止驱动程序找到它。我还很新,所以我还不能上传页面的 html 图像,这就是为什么我包含打开页面的行。谁能想出一个万无一失的解决方案?

【问题讨论】:

  • 你检查过你的程序最终的页面源吗?

标签: python selenium-webdriver xpath


【解决方案1】:

据我所知有两个问题。

您正试图在 div 元素上调用 send_keys()。您可能正在寻找的是 input 元素,它嵌套在 div 元素内。

这可以通过稍微改变你的 XPATH 来获得:

element = self.driver.find_element_by_xpath('//*[@name="username"]')
element.send_keys('...')

另一个可能的问题是元素并不总是立即加载 - 您有时必须等待元素出现在 HTML 中才能找到它。这可以使用Webdriver.Wait()来实现

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

# Wait for the element to appear in the HTML for a maximum of 10 seconds
element = WebDriverWait(self.driver, 10).until(
    EC.presence_of_element_located((By.NAME, "username"))
)

# Send input to the element
element.send_keys('...')

【讨论】:

  • 我把 XPath 改成了你说的输入。老实说,这就是我最初所做的,但出现了错误,所以我尝试寻找另一条路径,这就是我所展示的。正如你所说,我正在使用 WebDriverWait() ,但现在它说(NameError:name 'By' is not defined)。另外,我用 By.XPATH 更改了 By.NAME,并使用了输入路径。我猜这样,我在原文中写的 find_element_by_xpath 是不需要的吧?
  • @VektorElektor 你会得到NameError,因为你必须从selenium.webdriver.common.by 导入By(参见第二个代码sn-p 的顶部)。是的,如果您使用 WebDriverWait,则不需要 find_element_by_xpath 函数,因为一旦元素出现在 HTML 中,它将返回该元素。
【解决方案2】:

您可以在 Google Chrome 中使用检查来查找完整的 xpatch。 然后你的代码变成:

usbar = driver.find_element_by_xpath('/html/body/div[1]/section/main/article/div[2]/div[1]/div/form/div/div[1]/div/label/input') 

【讨论】:

  • 这就是我寻找 Xpath 的方式,我已经尝试过“复制完整 XPath”而不是“复制 XPath”,但无济于事。
猜你喜欢
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多