#python-3.x #selenium
Вопрос:
содержимое плавающего окна не включено в веб-код. он появляется только тогда, когда на нем наведена мышь. Итак, как я могу получить ценность в этой ситуации? Я нахожу это сложным, потому что для меня нет точки привязки, чтобы контролировать движение мыши.
Код выглядит так, как показано ниже,
def button_click(driver, button_num):
driver.execute_script("arguments[0].click();", button_num)
def catogory_obtain_tokyo(driver):
time_waiting_max = 20
try:
page_kansai = WebDriverWait(driver, time_waiting_max).until(
EC.presence_of_element_located((By.ID, 'snippet-13'))
)
buttons = WebDriverWait(page_kansai, time_waiting_max).until(
EC.presence_of_all_elements_located((By.CLASS_NAME, "mv-button-base.mv-hyperlink-button"))
)
return buttons
except:
print('catogory_obtain error')
driver.quit()
return ''
path = r'chromedriver.exe'
tokyo_url = r'https://www.eex.com/en/market-data/power/futures#{"snippetpicker":"EEX Japanese Power Futures - Tokyo"}'
# --- time line ---
timeline = '//*[@id="null"]/div/div[2]/div'
# ------- price trade reg ----
pane_pr = '//*[@id="null"]/div/div[1]/div[1]/div[2]'
# --------volume trade registration ------
pane_vtr = '//*[@id="null"]/div/div[1]/div[3]/div[2]'
driver = webdriver.Chrome(path)
driver.get(tokyo_url)
btns = catogory_obtain_tokyo(driver)
button_click(driver, btns[0])
time.sleep(3)
# sep-03 btn
date = '//*[@id="symbolheader_jft"]/div/div[1]/div[2]/table/tbody/tr[1]/td[5]'
date_btn = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.XPATH, date))
)
time.sleep(5)
date_btn.click()
# hit icon
icon_path = '//*[@id="baseloadwidget_jft"]/table/tbody/tr[2]/td[5]'
icon = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.XPATH, icon_path))
)
time.sleep(5)
icon.click()
time.sleep(5)
# --------- click volume btn ------
vtr_path = '//*[@id="baseloadwidget_jft"]/table/tbody/tr[3]/td/div/div[2]/div[3]/div[2]'
vtr_btn = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.XPATH, vtr_path))
)
time.sleep(5)
vtr_btn.click()
time.sleep(5)
tl = driver.find_element(By.XPATH, timeline)
webdriver.ActionChains(driver).move_to_element(tl).perform()
time.sleep(5)
pr = driver.find_element(By.XPATH, pane_pr)
webdriver.ActionChains(driver).move_to_element(pr).perform()
time.sleep(5)
vtr = driver.find_element(By.XPATH, pane_vtr)
webdriver.ActionChains(driver).move_to_element(vtr).perform()
time.sleep(5)
time.sleep(5)
driver.quit()
В принципе, я попробовал этот move_to_element
метод, но он перемещает мышь только в центр элемента. Однако здесь эта встроенная диаграмма рассматривается как один элемент, как я могу управлять движением мыши в пределах одного веб-элемента?
Комментарии:
1. Вы имеете в виду действия, выполняемые при наведении курсора мыши?
2. @fam да, что-то вроде этого. но как я могу получить относительное положение между мышью и таблицей данных? На самом деле, я хочу, чтобы мышь перемещалась внутри элемента.
3. Пожалуйста, укажите текущий пример кода и веб-сайт, на котором вы пробуете свой метод.
4. Это веб- сайт . Пожалуйста , проверьте данные на 2021-09-03 в
week
названной категорииweek 36/21
, нажмите на значок в конце строки, и вы увидите линейный график. это таблица, из которой я хочу сканировать данные.5. @Leo_Liu — Какой ожидается результат?
Ответ №1:
Я надеюсь, что это ответ, который вы ищете.
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome(executable_path="path to chromedriver.exe")
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.eex.com/en/market-data/power/futures#{"snippetpicker":"EEX Japanese Power Futures - Tokyo"}")
time.sleep(30) # Manually selected the options.
blocks = driver.find_elements_by_xpath("//div[@class='mv-panes-host']/div[3]/div[2]//*[local-name()='svg']/*[name()='g'][2]//*[name()='rect']")
actions = ActionChains(driver)
for block in blocks:
actions.move_to_element(block).perform()
time.sleep(2)
print(driver.find_element_by_xpath("//div[@id='null']/div/div[1]/div[3]/div[2]/div/div[contains(@class,'date')]").text)
print(driver.find_element_by_xpath("//div[@id='null']/div/div[1]/div[3]/div[2]/div//div[contains(@class,'name')]").text)
print(driver.find_element_by_xpath("//div[@id='null']/div/div[1]/div[3]/div[2]/div//div[contains(@class,'value')]").text)
driver.quit()
9/3/2021, 01:53:23 PM
Volume Trade Registration
840.000
9/3/2021, 01:56:26 PM
Volume Trade Registration
840.000
Комментарии:
1. Могу я спросить, почему вы пишете xpath таким образом
//div[@class='mv-panes-host']/div[3]/div[2]//*[local-name()='svg']/*[name()='g'][2]//*[name()='rect']
? Я использую xpath//*[@id="null"]/div/div[1]/div[3]/div[2]/svg/g[2]/g/g/*
, и он не работает.2. @Leo_Liu-Потому что мы пытаемся найти элемент, который является
svg
тегом. Если вы наблюдаете в DOM, элемент for//*[@id="null"]/div/div[1]/div[3]/div[2]
будет обнаружен, но/svg
не будет. Чтобы найти элемент вsvg
тегах, нам нужно предоставить xpath что-то вроде этого//*[name()="svg"]
или[local-name()='svg']