元素在 Selenium Chrome 无头模式下不可交互

Element not interactable in Selenium Chrome Headless Mode

当我在无头模式下不 运行 chrome 时,我的代码工作正常,但在无头模式下我得到 'Element not interactable'.

我在 email_box.send_keys('')

处遇到错误

而且我已经设置了 window 大小,但仍然不起作用

代码:

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import time

options = Options()
options.add_argument('headless')
options.add_argument('window-size=1366x768')

with Chrome(options=options) as driver:
    driver.get('https://accounts.google.com/login')

    WebDriverWait(driver, 20).until(lambda d: d.find_element(By.TAG_NAME, 'input'))

    time.sleep(2)
    email_box = driver.find_element(By.TAG_NAME, 'input')
    time.sleep(2)
    email_box.send_keys('example@gmail.com')

如果您尝试调试和打印“email_box”的 outerHTML,它正在寻找不可交互的元素,即

更 specific/unique 使用您的定位器。您可以使用 //input[@type="email"] 作为电子邮件字段

要将 gmail 发送到输入标签,请执行以下操作。

from selenium.webdriver.support import expected_conditions as EC

email_box=WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//input[@type='email']")))
driver.implicitly_wait(2)
email_box.send_keys('example@gmail.com')

如果有人想要另一种解决方案,我也找到了这个。由于某些原因,当 window 未最大化时,您可能无法单击元素:

在Python环境下给chromedriver添加如下参数

from selenium.webdriver.chrome.options import Options

def get_options():
    chrome_options = Options()
    chrome_options.add_argument("--window-size=1920,1080")
    chrome_options.add_argument("--start-maximized")
    chrome_options.add_argument("--headless")
    return chrome_options

所以我尝试了所有建议的解决方案,但没有任何效果。就我而言,我正在使用 AngularJS 抓取 SPA。我找到的解决方案是网络驱动程序的以下选项设置:

options.add_argument("--window-size=1920,1080")

然后等待您要单击的元素变得可单击,如前所示:

elem = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, 'somexpath')))

我尝试最大化 window 两种方式,即从选项以及直接从驱动程序实例。但是这两种方式都不适合我。

这是 link 到 Github 问题页面,我在其中找到了解决方案:https://github.com/angular/protractor/issues/5273

干杯