Как получить содержимое в плавающем окне мыши?

#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']