Есть ли эффективный способ добычи HTML-элементов для селена с использованием Python (и избегая инструментов Dev). Если это можно сделать с помощью BeautifulSoup, как? - PullRequest
0 голосов
/ 29 августа 2018

Я пишу скрипт селенового веб-драйвера для автоматизации процесса обновления портала регистрации событий.

Изображение интерфейса пользователя связано ниже.

Мне удалось успешно войти на веб-портал. С помощью элементов XPATH, скопированных из инструментов разработчика Chrome. Мне также удалось успешно автоматизировать переключение между отдельными папками в левой части экрана (2018, 2017, ..., Канада, США, ..., Ванкувер, Келоуна, ...). Имейте в виду, что я смог сделать это вручную, скопировав отдельные элементы XPATH для каждой ссылки на активную папку, как показано в приведенном ниже сценарии.

import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup


# Create a new instance of the Chrome driver
driver = webdriver.Chrome("C:/Users/Computer/Downloads/chromedriver")

# Go to the regOnline homepage
driver.get("######LoginPage#####")
driver.get("#####LinkedUIPage#####")
# the page is ajaxy so the title is originally this:
print ("print " + driver.title)


# find the username and password element
userElement = driver.find_element_by_id("ctl00_cphMaster_txtLogin")
passElement = driver.find_element_by_id("ctl00_cphMaster_txtPassword")

# find the login button element
logInElement = driver.find_element(By.LINK_TEXT,"Sign In")


# type in account information
userElement.send_keys("#####")
passElement.send_keys("#####")

# log into the webpage (hit the enter button)
logInElement.send_keys(Keys.ENTER)

# xpath elements
calgaryXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[1]/div/span[2]'
edmontonXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[2]/div/span[2]'
fortNelsonXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[3]/div/span[2]'
fortStJohnXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[4]/div/span[2]'
halifaxXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[5]/div/span[2]'
kamloopsXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[6]/div/span[2]'
kelownaXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[7]/div/span[2]'
ottawaXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[10]/div/span[2]'
princeGeorgeXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[11]/div/span[2]'
saskatoonXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[12]/div/span[2]'
thunderBayXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[13]/div/span[2]'
torontoXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[14]/div/span[2]'
vancouverXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[15]/div/span[2]'
whitehorseXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[16]/div/span[2]'
williamsLakeXPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/ul/li[17]/div/span[2]'

page2018XPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/div/img'
canada2018XPATH = '//*[@id="ctl00_ctl00_cphDialog_cpMgrMain_trUserNodes"]/ul/li[1]/ul/li[11]/ul/li[1]/div/img'

# find city element
calgary = driver.find_element(By.XPATH, calgaryXPATH)
edmonton = driver.find_element(By.XPATH, edmontonXPATH)
fortNelson = driver.find_element(By.XPATH, fortNelsonXPATH)
fortStJohn = driver.find_element(By.XPATH, fortStJohnXPATH)
halifax = driver.find_element(By.XPATH, halifaxXPATH)
kamloops = driver.find_element(By.XPATH, kamloopsXPATH)
kelowna = driver.find_element(By.XPATH, kelownaXPATH)
ottawa = driver.find_element(By.XPATH, ottawaXPATH)
princeGeorge = driver.find_element(By.XPATH, princeGeorgeXPATH)
saskatoon = driver.find_element(By.XPATH, saskatoonXPATH)
thunderBay = driver.find_element(By.XPATH, thunderBayXPATH)
toronto = driver.find_element(By.XPATH, torontoXPATH)
whitehorse = driver.find_element(By.XPATH, whitehorseXPATH)
vancouver = driver.find_element(By.XPATH, vancouverXPATH)
williamsLake = driver.find_element(By.XPATH, williamsLakeXPATH)

page2018 = driver.find_element(By.XPATH, page2018XPATH)
canada2018 = driver.find_element(By.XPATH, canada2018XPATH)

from selenium.webdriver.common.action_chains import ActionChains

actions = ActionChains(driver)

def goToPage(xpath, sec):
    actions.move_to_element(xpath)
    actions.click(xpath)
    actions.perform()
    time.sleep(sec)

# testing individual page access
goToPage(page2018,3)
goToPage(canada2018,3)



# save page html
#html = driver.page_source

#soup = BeautifulSoup(html)

Ссылаясь на изображение, мне нужно получить доступ ко всем отдельным ссылкам на события в средней правой части пользовательского интерфейса, журнале событий. Копировать каждый элемент XPATH из каждой ссылки было бы трудоемким и ненужным. Кроме того, они будут постоянно обновляться, и мне потребуется метод для доступа к отдельным элементам без ручного копирования и вставки из инструментов разработчика браузера.

Снимок экрана пользовательского интерфейса

ВОПРОС: - Есть ли эффективный способ добычи HTML-элементов для селена с использованием Python (и избегая инструментов Dev).

- Можно ли сделать это с красивым супом, анализируя DOM HTML - Если предлагаемый метод распространяется на какие-либо элементы пользовательского интерфейса, тем лучше.

ПРИМЕЧАНИЕ - Я не знаю, как сделать это в красивом супе, если это возможно.

С уважением, J

...