鱼C论坛

 找回密码
 立即注册
查看: 1111|回复: 5

关于selenium元素查找的问题

[复制链接]
发表于 2021-8-7 12:56:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 DrWhiter 于 2021-8-8 15:01 编辑

我试着运行下方代码:
  1. from selenium import webdriver
  2. from selenium.webdriver import ActionChains
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.support.ui import WebDriverWait
  6. import time   # 导入模块
  7. username = "QQ number"
  8. password = "QQ password"     # 输入QQ账号和密码(给登录用)
  9. browser = webdriver.Chrome(executable_path="chromedriver.exe")
  10. browser.get("https://passport.bilibili.com/login")
  11. time.sleep(2)   # 打开登录页
  12. btn_qq = browser.find_element_by_class_name('qq')    # 寻找“用QQ账号登录”按钮(下同)
  13. actions = ActionChains(browser)
  14. actions.click(btn_qq).perform()    # 点击按钮
  15. element = WebDriverWait(driver=browser, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="switcher_plogin"]')))     # 检查“用账号登录”按钮是否存在(下同)
  16. btn_up = browser.find_element_by_xpath('//*[@id="switcher_plogin"]')     # 定位元素位置(下同)
  17. time.sleep(1)
  18. actions.click(btn_up).perform()     # 点击按钮(下同)
  19. element1 = WebDriverWait(driver=browser, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="u"]')))
  20. username_input = browser.find_element_by_xpath('//*[@id="u"]')
  21. element2 = WebDriverWait(driver=browser, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="p"]')))
  22. password_input = browser.find_element_by_xpath('//*[@id="p"]')
  23. username_input.send_keys(username)
  24. time.sleep(2)
  25. username_input.send_keys(password)
  26. element3 = WebDriverWait(driver=browser, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="login_button"]')))
  27. button = browser.find_element_by_xpath('//*[@id="login_button"]')
  28. time.sleep(1)
  29. actions.click(button).perform()
复制代码

报错如下:
  1. Traceback (most recent call last):
  2.   File "E:\文档\Python\爬虫\新建文本文档2.py", line 15, in <module>
  3.     element = WebDriverWait(driver=browser, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="switcher_plogin"]')))
  4.   File "D:\Python\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
  5.     raise TimeoutException(message, screen, stacktrace)
  6. selenium.common.exceptions.TimeoutException: Message:
复制代码

这该如何解决?(在开发者工具里能用Xpath找到元素)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-9 09:56:46 | 显示全部楼层
你为什么要设置个超时呢,这也不是元素不元素的问题啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-10 08:58:05 | 显示全部楼层
我看了一下,那个登录页面在一个新的iframe中,这种情况下使用selenium需要先切换到新的iframe中才能继续定位,否则定位不到。
你可以直接输入到irame对应的网页(开发者工具中可以看到)。更为标准的做法是switch_to_iframe。
你可以百度一下selenium如何定位到iframe中的元素,这应该属于一个基本操作,很多网页的登录界面都是在新的iframe中的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-10 09:11:45 | 显示全部楼层
  1. from selenium import webdriver
  2. from selenium.webdriver import ActionChains
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.support.ui import WebDriverWait
  6. import time   # 导入模块
  7. username = "QQ number"
  8. password = "QQ password"     # 输入QQ账号和密码(给登录用)
  9. browser = webdriver.Chrome(executable_path="D:/PYTHON/chromedriver.exe")
  10. browser.get("https://passport.bilibili.com/login")
  11. time.sleep(2)   # 打开登录页
  12. btn_qq = browser.find_element_by_class_name('qq')    # 寻找“用QQ账号登录”按钮(下同)
  13. actions = ActionChains(browser)
  14. actions.click(btn_qq).perform()    # 点击按钮
  15. time.sleep(2)
  16. iframe = browser.find_element_by_xpath('//*[@id="ptlogin_iframe"]')
  17. browser.switch_to_frame(iframe)
  18. # # element = WebDriverWait(driver=browser, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="switcher_plogin"]')))     # 检查“用账号登录”按钮是否存在(下同)
  19. # time.sleep(3)
  20. browser.find_element_by_xpath('//*[@id="switcher_plogin"]').click()     # 定位元素位置(下同)
  21. time.sleep(1)
  22. # actions.click(btn_up).perform()     # 点击按钮(下同)
  23. # element1 = WebDriverWait(driver=browser, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="u"]')))
  24. username_input = browser.find_element_by_xpath('//*[@id="u"]')
  25. # element2 = WebDriverWait(driver=browser, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="p"]')))
  26. password_input = browser.find_element_by_xpath('//*[@id="p"]')
  27. username_input.send_keys(username)
  28. time.sleep(2)
  29. password_input.send_keys(password)
  30. # element3 = WebDriverWait(driver=browser, timeout=10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="login_button"]')))
  31. browser.find_element_by_xpath('//*[@id="login_button"]').click()
  32. # time.sleep(1)
  33. # actions.click(button).perform()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-10 09:13:41 | 显示全部楼层

这个是我在你的代码基础上修改的,WebDriverWait我直接改成time.sleep了,还有action.click(button).perform我没有用过,也没有运行成功,我直接改成click()了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-10 09:17:42 | 显示全部楼层
还有推荐给你一个谷歌插件,Xpath Helper,它可以根据你的Xpath模拟爬虫程序查找一下元素,可以看出来你的xpath放在程序中是否能真正定位到元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-4 23:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表