Python Selenium“无法定位元素”

Posted

技术标签:

【中文标题】Python Selenium“无法定位元素”【英文标题】:Python Selenium "Unable to locate element" 【发布时间】:2021-05-13 05:37:04 【问题描述】:

我正在尝试使用 Selenium 在需要时自动注册电子邮件帐户。这对我来说只是一个有趣的学习项目。对于我的生活,我不明白为什么它找不到元素。此代码在登录页面上运行良好,但在注册页面上运行良好。我尝试了所有不同的 Selenium 命令,甚至尝试使用 ID 和类名。要么是说它无法找到该元素,要么是它无法通过键盘访问。

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
import time


options = Options()

driver = webdriver.Firefox(options=options, executable_path=r'geckodriver.exe')


driver.get("https://mail.protonmail.com/create/new?language=en")
time.sleep(10)
username_input = driver.find_element_by_id("username").send_keys("testusername")

这里还有 html 代码:https://i.imgur.com/ZaBMTzG.png

【问题讨论】:

【参考方案1】:

用户名字段在 iframe 中,您需要切换到 iframe 才能使用。 下面是运行良好的代码:

driver.get("https://mail.protonmail.com/create/new?language=en")
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='Registration form'][class='top']"))
driver.find_element_by_id("username").send_keys("some string")
    阅读更多关于 iframe here 详细了解如何使用 Python 切换到 iframe/frame/frameset 硒绑定here

更新:

wait = WebDriverWait(driver, 30)
driver.get("https://mail.protonmail.com/create/new?language=en")
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='Registration form'][class='top']"))
driver.find_element_by_id("username").send_keys("some string")
driver.switch_to.default_content()
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
sleep(5)
driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='Registration form'][class='bottom']"))
wait.until(EC.element_to_be_clickable((By.NAME, "submitBtn"))).click()

【讨论】:

成功了!谢谢,我也在阅读您提供的链接。在过去的几个小时里试图弄清楚这一点。非常感谢。 另一个问题。对于“注册”按钮,它也在 iframe 中。这是代码:i.imgur.com/FMnJQfN.png 我为切换到 iframe 所做的代码应该可以工作,与您给出的相同,但它是“无法找到元素” driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='Registration form'][class='bottom']")) create_button = driver.find_element_by_class_name("btn btn-submit").actions.click("btn btn-submit") @Sims :不,您需要先使用 driver.switch_to.default_content() 切换到默认内容,然后您可以切换到新的 iframe driver.switch_to.frame(driver.find_element_by_css_selector("iframe[title='Registration form'][class='bottom']")) 在执行上述代码之前,我执行了 driver.switch_to.default_content() 所以它应该可以工作,但它不是。 你能解释一下这行代码吗? "driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")" 只是滚动到页面末尾的javascript命令?我只是不明白为什么需要它。【参考方案2】:

我不确定我是否看到了足够的代码来诊断,但我认为您定义username_input 的方式似乎有问题。 driver.find_element_by_id("username").send_keys("testusername") 实际上并没有返回任何东西,所以看起来你正在设置 username_input = null

【讨论】:

以上是关于Python Selenium“无法定位元素”的主要内容,如果未能解决你的问题,请参考以下文章

Python:Xpath 无法定位元素

python+selenium自动化写登录脚本时,弹出的第三方登录页面该如何定位元素?

selenium无法定位元素问题

NoSuchElementException,Selenium 无法定位元素

解决selenium自动化,消息弹窗3秒消失,无法定位元素问题。

八年测试经验,吐血整理出Selenium无法定位元素的几种解决方案