解决!当元素存在时,如何让find_element_by_id("login_field")停止引发NoSuchEleentException,为什么会发生?



我正在学习Python,特别是现在的浏览器自动化和代码:

from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://github.com")
browser.maximize_window()
signin_link = browser.find_element_by_link_text("Sign in")
signin_link.click()
username_box=browser.find_element_by_id("login_field")

browser.quit()

引发NoSuchElementException,当根据控制台:

<input type="text" name="login" id="login_field" class="form-control input-block js-login-field" autocapitalize="off" autocorrect="off" autocomplete="username" autofocus="autofocus">

元素存在

要解决查找"Sign in"的类似问题按钮会引发同样的异常,请注意,我已经从selenium v4.3.0切换到selenium v3.141.0。

你看到的代码几乎与我在Python课程中展示的代码相同,除了'browser.maximize_window()'方法,只是因为"Sign in"按钮将不存在。显示代码的视频显示一切正常。

然而,同样的问题又出现了。

我已经试过了:

  • 让Python在打开登录页面和找到元素之间等待一定的时间,同时使用'隐式等待'和'time '。sleep'和'WebDriverWait'
  • 让Python等待,然后从id为'login_field'的最外层元素工作到id为'login_field'的元素。(我不知道如何告诉HTML源代码内的iframe,这个解决方案没有工作)
  • 使用'find_element_by_class_name'代替'find_element_by_ID'

这些解决方案都不起作用!

你能告诉我为什么即使元素存在也会引发异常,以及解决问题的一般解决方案,如果你怀疑元素是否在iframe内,告诉我如何在浏览器控制台告诉iframe ?

我已经解决了这个问题与此URL NoSuchElementException和SyntaxError的帮助下,在网页抓取,并通过更新回硒v4.3.0(不再引发异常,错误是我没有最大化窗口第一)。

要解决类似的问题,首先使用v4.3.0版本(硒3.141.0关闭浏览器,当我尝试使用WebDriverWait,我还没有看到bug与v4.3.0),然后最大化窗口,以确保元素可以看到,然后使用WebDriverWait等待,直到元素可见(元素应该是可见的硒在一秒钟)。如果不成功,请在Google上搜索异常。

添加后它对我有效代码中的WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, "login_field")))。很可能元件id="login_field"需要一些时间来加载,username_box=browser.find_element_by_id("login_field")行在加载完成之前执行,导致元件未找到错误。对我来说,它适用于Selenium 3.141.0。也为我工作,即使我删除browser.maximize_window()

完整代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get("https://github.com")
browser.maximize_window()
signin_link = browser.find_element_by_link_text("Sign in")
signin_link.click()
WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, "login_field")))
username_box=browser.find_element_by_id("login_field")
browser.quit()

最新更新