Получите точки данных из графика и закройте модальное окно внутри теневого корняPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Получите точки данных из графика и закройте модальное окно внутри теневого корня

Сообщение Anonymous »

Я пытаюсь очистить график на веб-сайте: https://www.xe.com/currencycharts/?from ... SD&view=5Y
Сначала я попытался получить данные через сетевой запрос: как получить данные из динамического графика в 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()

Я получаю сообщение «ЗАКРЫТЬ ФОРМУ ОБЪЯВЛЕНИЯ» в терминале, но не могу найти кнопку «X» внутри формы, чтобы закрыть ее.
Вот изображение окна браузера:
Изображение

Я нашел код для взаимодействия с теневым корнем из следующего вопроса: Как найти элемент на хосте с теневым корнем (закрытом)
скрипт в основном остается неподвижным после появления этого модального окна, а через некоторое время скрипт закрывается со следующей ошибкой:

Код: Выделить всё

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
Курсор перемещается из середины элемента, а не из начала, и останавливается примерно в 25 октября 2023 года (примерно)
Изображение

Изображение


Подробнее здесь: https://stackoverflow.com/questions/792 ... hadow-root
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»