Сначала я попытался получить данные через сетевой запрос: как получить данные из динамического графика в Python, но это не сработало.
Теперь я пытаюсь переместить курсор на график элемента и перемещаться по нему по горизонтали, я могу успешно получить точки данных, но сталкиваюсь со следующими проблемами:
1- Курсор начинает перемещаться из середины элемент, а не его начало. Я также пытался переместить его по координатам, но получил ошибку «Элемент вне границ». Он работает нормально, а ближе к концу чаще всего выдает ошибку «Элемент вне границ».
2- Иногда поверх графика появляется модальное окно. , который я не могу закрыть, поскольку кнопка закрытия для него находится внутри элемента #shadow-root.
Я попробовал следующий код, чтобы попытаться получить точки данных и закройте модальное окно:
Код: Выделить всё
from selenium.webdriver.chrome.options import Options
from shutil import which
from selenium import webdriver
import time
import os
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import pandas as pd
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
import time
BASE_DIR = os.getcwd()
chrome_path = which("chromedriver")
options = Options()
currentDirectory = os.getcwd()
options.add_argument("--log-level=3")
options.add_argument("--start-maximized")
options.add_argument("--remote-debugging-port=9222")
# options.add_argument('--headless')
service = Service(executable_path=chrome_path)
wait_time = 20
driver = webdriver.Chrome(service=service, options=options)
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': """
Element.prototype._attachShadow = Element.prototype.attachShadow;
Element.prototype.attachShadow = function () {
return this._attachShadow( { mode: "open" } );
};
"""})
# Load the website
driver.get('https://www.xe.com/currencycharts/?from=SGD&to=USD&view=5Y')
try:
driver.maximize_window()
except:
pass
# Wait for the page to fully load (add explicit waits if needed)
driver.implicitly_wait(10)
element = driver.find_element(by=By.XPATH, value="//div[@class='recharts-wrapper']")
element_width = element.size['width']
actions = ActionChains(driver)
time.sleep(1)
try:
accept_cookies_button = driver.find_element(by=By.XPATH, value="//button[@class='sc-fe840e0c-0 kpuPwJ']")
accept_cookies_button.click()
except:
pass
# Move across the element with 10 px increments horizontally
# for x_offset in range(0, element_width, 10):
# actions.move_to_element_with_offset(element, x_offset, 0).perform()
ad_form_found = False
for x_offset in range(1, element_width, 10):
if not ad_form_found:
try:
close_ad_form = driver.find_element(by=By.XPATH, value="//div[@id='yie-overlay-wrapper-fe8ec9fc-c476-5739-bef4-7a89b6181df9']/yld-tag-host-campaign")
if close_ad_form:
print('CLOSE AD FORM FOUND')
shadow_root = driver.execute_script('return arguments[0].shadowRoot', close_ad_form)
# close_ad_button = shadow_root.find_element(by=By.XPATH, value="//button[@id='element-Rrwwg7']")
close_ad_button = shadow_root.find_element(by=By.CSS_SELECTOR, value="button[id^='element']")
if close_ad_button:
print("close ad button found")
ad_form_found = True
close_ad_button.click()
except:
pass
actions.move_to_element_with_offset(element, x_offset, 1).perform()
# paragraph_elements = driver.find_elements(by=By.XPATH, value="//div[@class='recharts-tooltip-wrapper recharts-tooltip-wrapper-left recharts-tooltip-wrapper-bottom']/div/p")
paragraph_elements = driver.find_elements(by=By.XPATH, value="//div[@class='recharts-tooltip-wrapper recharts-tooltip-wrapper-right recharts-tooltip-wrapper-bottom']/div/p")
for paragraph in paragraph_elements:
print(paragraph.text)
time.sleep(0.1)
# Close the browser
driver.quit()
Вот изображение окна браузера:

Я нашел код для взаимодействия с теневым корнем из следующего вопроса: Как найти элемент на хосте с теневым корнем (закрытом)
скрипт в основном остается неподвижным после появления этого модального окна, а через некоторое время скрипт закрывается со следующей ошибкой:
Код: Выделить всё
Traceback (most recent call last):
File "Test.py", line 117, in
actions.move_to_element_with_offset(element, x_offset, 1).perform()
selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: move target out of bounds


Подробнее здесь: https://stackoverflow.com/questions/792 ... hadow-root