无法通过Selenium驱动点击输入框(元素不在shadow DOM或iframe中)

0 投票
1 回答
25 浏览
提问于 2025-04-14 17:10

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

我刚开始使用Selenium进行自动化操作,但遇到了一个问题。无论我怎么做,我都无法点击城市名称的输入框(这个输入框用“city”这个变量表示)。

我查看过这个元素是否在影子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")

1 个回答

1

你遇到的问题是因为网站上有两个层级的元素,它们的ID是一样的(这其实是不好的做法,不过这是前端开发的问题)。

第一个层级是隐藏的(我猜这是背景层或者移动视图),所以当你试图等待某个元素可以点击的时候,它是无法点击的。

要访问可见的元素,有一个方法是获取所有元素的数组,然后筛选出那些可见的元素。

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

撰写回答