Получите точки данных из графика и закройте модальное окно внутри теневого корня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 ... SD&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()
for x_offset in range(1, element_width, 10):
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']")
if close_ad_button:
print("close ad button found")
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


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

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

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

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

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

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

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