Selenium元素在headless模式下不可交互错误,但在没有headless的情况下工作

p5fdfcr1  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(284)

我正在尝试ted.europa.eu使用Python和Selenium从招标中检索信息。该脚本应该每天执行一次。我遇到的问题是,导航到新的招标,我需要Selenium应用过滤器,以仅获取来自脚本执行当天的招标。我已经有了用于此的脚本,并且运行良好。问题是,当我激活headless模式时,我得到以下错误selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: [object HTMLInputElement] has no size and location
这是我的代码,应用过滤器我需要:

import sys
import time
import re
from datetime import datetime
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from dotenv import load_dotenv

load_dotenv("../../../../.env")

sys.path.append("../src")
sys.path.append("../../../../utils")

from driver import *
from lted import LTED
from runnable import *

# start
print('start...')
counter = 0
start = datetime.now()

# get driver
driver = get_driver_from_url("https://ted.europa.eu/TED/browse/browseByMap.do%22)
actions = ActionChains(driver)

# change language to spanish
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "lgId")))
driver.find_element(By.ID, "lgId").click()
driver.find_element(By.XPATH, "//select[@id='lgId']/option[text()='español (es)']").click()

# click on "Busqueda avanzada"
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "goToSearch")))
driver.find_element(By.ID, "goToSearch").click()

# accept cookies and close tab
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "cookie-consent-banner")))
driver.find_element(By.XPATH, "//div[@id='cookie-consent-banner']/div[1]/div[1]/div[2]/a[1]").click()
driver.find_element(By.XPATH, "//div[@id='cookie-consent-banner']/div[1]/div[1]/div[2]/a[1]").click()

# click on specific date and set to today
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "publicationDateSpecific")))
element = driver.find_element(By.ID, "publicationDateSpecific")
actions.move_to_element(element).perform()

driver.find_element(By.ID, "publicationDateSpecific").click()
driver.find_element(By.CLASS_NAME, "ui-state-highlight").click()

# click on search
driver.find_element(By.ID, "search").click()

从导入中,我唯一需要解释的是,从from dirver import *行得到了get_driver_from_url()方法,该方法将在后面的代码中使用。

def get_driver_from_url(url):
    options = webdriver.ChromeOptions()
    options.add_argument("--no-sandbox") 
    options.add_argument("--disable-dev-shm-usage")
    options.add_argument("--start-maximized") 
    options.add_argument("--headless") 
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver.get(url)
    return driver

正如我所说,这段代码在没有无头模式的情况下工作得很完美,但当激活时,我会得到错误。
一开始出现了另一个错误,在互联网上搜索发现可能是因为元素不在屏幕上,所以我添加了参数"--start-maximized"以确保Chrome选项卡尽可能大,并添加了ActionChains以使用actions.move_to_element(element).perform(),但我在这一确切的代码行上出现了此错误。
还尝试将行WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "publicationDateSpecific")))更改为WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "publicationDateSpecific"))),但它就是不起作用。
更新:还尝试更改为EC.visibility_of_element_located,如this帖子中所述,但也不起作用
我做错了什么?

xqnpmsa8

xqnpmsa81#

这可能是由于窗口大小的原因。请尝试添加以下内容:

chrome_options = Options()
    chrome_options.add_argument("--window-size=1920,1080")
    chrome_options.add_argument("--start-maximized")
    chrome_options.add_argument("--headless")
k2arahey

k2arahey2#

所以,经过长时间的尝试和错误,我发现添加

element = driver.find_element(By.ID, "publicationDateSpecific")
driver.execute_script("window.scrollTo(0,"+str(element.location["y"])+")")

使脚本在无头模式和正常模式下工作

相关问题