在Selenium Chrome Headless Mode中元素无法交互

9

当我不以无头模式运行 Chrome 时,我的代码运行得很好,但在无头模式下,我会收到“元素无法交互”的错误。

我在 email_box.send_keys('') 处遇到了错误

并且我已经设置了窗口大小,但仍然不起作用

代码:

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')
5个回答

19

如果有人想找另外的解决方案,我也发现了这个。由于某种原因,当窗口没有最大化时,您可能会遇到单击元素的麻烦:

在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

1
这个答案真是救了我的一天。由于无头模式下窗口太小,我的元素超出了可见区域并被隐藏了起来。将窗口最大化可以解决这个问题。 - Kirill Metrik
非常感谢 - 花了好几个小时才弄明白! - undefined

1

我尝试了所有提出的解决方案,但都不适用于我的情况。在我的情况下,我正在使用AngularJS爬取单页应用程序。我找到的解决方案是为webdriver设置以下选项:

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

之后只需等待您想要点击的元素可点击,就像之前演示的那样:

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

我尝试了两种方式来最大化窗口,即从选项和直接从驱动程序实例中。但是两种方法都对我无效。
这是我找到解决方案的Github问题页面链接:https://github.com/angular/protractor/issues/5273 干杯

对我来说可行,但我选择了稍小的尺寸,1280x720。谢谢! - dw1

1
将 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')

它可以工作了,伙计!非常感谢!您能否详细说明一下为什么在非无头模式下能够找到的元素,在无头模式下却不可用?如果这是个愚蠢的问题,请见谅,因为我刚接触无头浏览器。非常感谢你! - Mubbashir Ali
主要的问题更多是关于你选择标签而不是在无头模式下运行。 - Arundeep Chohan

0

我曾经遇到过同样的问题。只有将代码放在try catch中才能解决它。例如:

enter code here

public void crearSiniestro() throws InterruptedException { 创建事故()抛出中断异常 }

try {
WebElement crear=wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("SiniestrosListForm:datalist:crearButton")));
crear.click();
}
catch(Exception e) {
    System.out.println("Options not available");
 }  

}


0
如果你尝试调试并打印“email_box”的outerHTML,它会寻找一个不可交互的元素,这是因为

使用更具体/唯一的定位器。您可以使用//input[@type="email"]来定位电子邮件字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接