无法使用 Selenium 驱动程序单击输入字段(元素未隐藏在影子 DOM 或 iframe 内)

问题描述 投票:0回答:1

我正在尝试抓取以下网站https://www.immobilienscout24.de/

我刚刚开始使用 Selenium 进行自动化过程,并且已经遇到了障碍。无论我做什么,我都无法单击城市名称的输入字段(在变量“city”下)。

我查看了该元素是否位于 Shadow DOM 或 iframe 下,但我没有发现它位于其中任何一个下。

这是元素的代码:

city = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="oss-location"]')))
city.click()
city.send_keys('Berlin')

如果需要,这里是整个代码:

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

URL = "https://www.immobilienscout24.de/"

driver = webdriver.Chrome()
driver.get(URL)

time.sleep(3)

def get_shadow_root(element):
    return driver.execute_script('return arguments[0].shadowRoot', element)

# Handle cookies
shadow_host = driver.find_element(By.ID, 'usercentrics-root')
accept_cookies = get_shadow_root(shadow_host).find_element(By.CSS_SELECTOR, '[data-testid=uc-accept-all-button]')
accept_cookies.click()

# Input field for city name
city = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="oss-location"]')))
city.click()
city.send_keys('Berlin')

page_source = driver.page_source

driver.quit()

soup = BeautifulSoup(page_source, "html.parser")
python selenium-webdriver
1个回答
0
投票

只要侧面有两层具有相同 id 的元素,您就会遇到这个问题(这是不好的做法,但它对它们的 FE 有问题)。 第一层是隐藏的(我猜它是背景或移动视图),所以当您尝试等待可点击条件时,它是不可点击的。

要访问可见元素,选项之一是获取元素数组并过滤它们以获得可见性。

city_inputs = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="oss-location"]')))
visible_input = [element for element in city_inputs if element.is_displayed()][0]
visible_input.click()
visible_input.send_keys('Berlin')
© www.soinside.com 2019 - 2024. All rights reserved.