预计所需阅读时间:5分钟

第一次遇到这个错误是我尝试用Selenium登陆淘宝的时候,当里想无头模式去爬一些简单的信息,但要先过登陆这一关。Selenium的无头模式是控制浏览器去运行时,不显示运作时的界面,也避免了个人误操作。但如果在淘宝上登陆就会出现selenium.common.exceptions.ElementNotInteractableException的错误。

在Stackoverflow搜索解决这个的办法有两个,我尝试第一个之后,就可以登陆淘宝了。

一、设置窗口大小

正在处理无头模式,因此需要设置windows-size,这样才能使后继参数得到传递。Selenium控制浏览窗口的几个方法,可以查看昨天的文章,本人的实例化代码如下,全部代码可找到本人Githubdata_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包里引入WebDriverWaitelement_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')