解决selenium.common.exceptions.ElementNotInteractableException尝试使用Selenium和Python登录时元素不可交互的错误
预计所需阅读时间:5分钟
第一次遇到这个错误是我尝试用Selenium登陆淘宝的时候,当里想无头模式去爬一些简单的信息,但要先过登陆这一关。Selenium的无头模式是控制浏览器去运行时,不显示运作时的界面,也避免了个人误操作。但如果在淘宝上登陆就会出现selenium.common.exceptions.ElementNotInteractableException的错误。
在Stackoverflow搜索解决这个的办法有两个,我尝试第一个之后,就可以登陆淘宝了。
一、设置窗口大小
正在处理无头模式,因此需要设置windows-size,这样才能使后继参数得到传递。Selenium控制浏览窗口的几个方法,可以查看昨天的文章,本人的实例化代码如下,全部代码可找到本人Github的data_analysis仓库:
import time from selenium.webdriver.chrome.webdriver import Options, WebDriver # 创建实例 options = Options() # 开启无头模式 options.headless = True # 设置窗口大小,这是本人显示器浏览最大化时的尺寸 options.add_argument('window-size=1550x838') # 关闭自动控制提示 options.add_experimental_option('excludeSwitches', ['enable-automation']) # 浏览器路经请修改为自己的 browser = WebDriver(r'D:\Browser\Chromium\chromedriver.exe', options=options) # 打开网页 browser.get('https://www.taobao.com') # 再次将浏览器最大化显示,也是因为显示器原因 browser.maximize_window() print('windows', browser.get_window_size()) # 隐性等待页面加载完成,如果一个元素获取不到,会等待30s browser.implicitly_wait(30)
二、等待元素到可以点击为止
在Selenium包里引入WebDriverWait和element_to_be_clickable模块,Stackoverflow参考代码如下:
from selenium.webdriver.chrome.options import Options 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 from selenium.webdriver.common.action_chains import ActionChains options = Options() options.add_argument('--headless') options.add_argument('--disable-gpu') options.add_argument("start-maximized") options.add_argument("disable-infobars") options.add_argument("--disable-extensions") options.add_argument("window-size=1920x1080") email = '[email protected]' password = 'fakepass3' driver = webdriver.Chrome('chromedriver', options=options) driver.get('https://www.ecobolsa.com/index.html') WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//button[normalize-space()='ACEPTO']"))).click() loginlink=WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//li[@class='login']/a"))) ActionChains(driver).move_to_element(loginlink).click(loginlink).perform() WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"userNameTextBox"))).send_keys(email) WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.ID,"password_login"))).send_keys(password) print('pass')
继续阅读