Я пишу скрипт селенового веб-драйвера для автоматизации процесса обновления портала регистрации событий.
Изображение интерфейса пользователя связано ниже.
Мне удалось успешно войти на веб-портал. С помощью элементов 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