我正在尝试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帖子中所述,但也不起作用
我做错了什么?
2条答案
按热度按时间xqnpmsa81#
这可能是由于窗口大小的原因。请尝试添加以下内容:
k2arahey2#
所以,经过长时间的尝试和错误,我发现添加
使脚本在无头模式和正常模式下工作