无法使用Selenium和Python通过xpath定位元素

2024-10-06 07:14:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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:没有这样的元素:无法定位元素:{“方法”:“xpath”,“选择器”:“/*[@id=“loginForm”]/div/div[1]”

它找不到要写入的用户名表单。我相信没有iFrame在路上,我不知道是否有任何其他问题阻止司机找到它。我是一个新手,所以我还不能上传页面html的图片,这就是为什么我要加入打开页面的那一行。谁能想出一个万无一失的解决办法


Tags: theinselfdivcoman表单driver
2条回答

从我看来有两个问题

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

这可以通过稍微更改XPATH来实现:

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

另一个可能的问题是,元素并不总是立即加载的——有时您必须等待元素出现在HTML中,然后才能找到它。这可以通过使用^{}来实现

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('...')

您可以使用Google Chrome中的inspect查找完整的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') 

enter image description here

相关问题 更多 >