如何使用selenium访问svg对象内的元素

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

我正在尝试使用 Selenium 从 OpenStreetBrowser 访问速度数据,但我无法访问网站的 SVG 元素。

这是我到目前为止所尝试过的

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

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.openstreetbrowser.org')

wait = WebDriverWait(driver, 15)

xpath_expression = f"//a[contains(text(), 'Transportation')]"
wait.until(EC.element_to_be_clickable((By.XPATH, xpath_expression))).click()

xpath_expression = f"//a[contains(text(), 'Individual Traffic')]"
wait.until(EC.element_to_be_clickable((By.XPATH, xpath_expression))).click()

xpath_expression = f"//a[contains(text(), 'Maxspeed')]"
wait.until(EC.element_to_be_clickable((By.XPATH, xpath_expression))).click()

xpath_expression = f"//li[contains(text(), 'search')]"
wait.until(EC.element_to_be_clickable((By.XPATH, "//ul[@class='tabs-list']//li[@title='search']"))).click()

wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='tabs-section nominatim-search selected']//input"))).send_keys('53.40125254855821,-3.0876670857133757')
wait.until(EC.element_to_be_clickable((By.XPATH, "//div[@class='tabs-section nominatim-search selected']//ul//li"))).click()

a = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='map']//div[1]//div[2]//svg")))

我遇到以下异常

TimeoutException: Message: 
Stacktrace:
    GetHandleVerifier [0x00007FF737801502+60802]
    (No symbol) [0x00007FF73777AC02]
    (No symbol) [0x00007FF737637CE4]
    (No symbol) [0x00007FF737686D4D]
    (No symbol) [0x00007FF737686E1C]
    (No symbol) [0x00007FF7376CCE37]
    (No symbol) [0x00007FF7376AABBF]
    (No symbol) [0x00007FF7376CA224]
    (No symbol) [0x00007FF7376AA923]
    (No symbol) [0x00007FF737678FEC]
    (No symbol) [0x00007FF737679C21]
    GetHandleVerifier [0x00007FF737B0411D+3217821]
    GetHandleVerifier [0x00007FF737B460B7+3488055]
    GetHandleVerifier [0x00007FF737B3F03F+3459263]
    GetHandleVerifier [0x00007FF7378BB846+823494]
    (No symbol) [0x00007FF737785F9F]
    (No symbol) [0x00007FF737780EC4]
    (No symbol) [0x00007FF737781052]
    (No symbol) [0x00007FF7377718A4]
    BaseThreadInitThunk [0x00007FF87E237344+20]
    RtlUserThreadStart [0x00007FF87FD826B1+33]

似乎每条路段都被排列为图像/图块。我想单击每个图像,然后单击弹出窗口上的“详细信息”选项来收集所需的数据。我如何访问该网站上的每个图块并单击它?

提前致谢!

python selenium-webdriver web-scraping openstreetmap
1个回答
0
投票

SVG 元素必须与其他元素区别对待。您需要稍微更新您的定位器才能访问它们。而不是

(By.XPATH, "//svg")

你需要使用

(By.XPATH, "//*[name()='svg']")

因此您的 SVG 定位器将更改为

a = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id='map']//div[1]//div[2]//*[name()='svg']")))
© www.soinside.com 2019 - 2024. All rights reserved.