我正在学习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()