Selenium Automation для выбора пункта меню li в Ul с Python и Selenium - PullRequest
0 голосов
/ 24 января 2020

Итак, у меня возникла общая проблема: я пытаюсь автоматизировать вход в систему, выбор пунктов меню, а затем предварительно заполнить поля для инициализации загрузки файла. Я был в состоянии автоматического входа, большое спасибо за ответ, предоставленный в другом посте. Однако мне не удалось перейти к указанному пункту меню c и выбрать этот элемент, чтобы перейти на новую страницу. Если я go перехожу на эту страницу напрямую, я выхожу из системы и должен снова войти в систему. Есть место под названием «Пользовательские отчеты», это то, что мне нужно нажать, чтобы перейти на другую страницу. Если бы у объектов li были идентификаторы, это сделало бы это намного проще, однако идентификаторов не было бы, как можно себе представить. Вот источник веб-страницы, которую я пытаюсь автоматизировать, перейдите по ссылке, которую я сохранил в github.

https://github.com/Richard-Barrett/ITDataServicesInfra/blob/master/Python/Collegeboard/TSI/tsi_pagesource

Я пытаюсь нажать на этот элемент

                  <li ng-show="core.acl['244']!='N'" ng-class="{active:isLocation('/customReports')}">
                     <a href="#/customReports" translate='reports.CustomReports.title'></a>
                  </li>

Как вы можете себе представить, я не смог сделать так. Вот код, который я использую для извлечения информации. Автоматизация входа в систему работает.

#!/bin/python
# ===========================================================
# Created By: Richard Barrett
# Organization: DVISD
# DepartmenT: Data Services
# Purpose: Test Score & 3rd Party Website Data Pull Automation
# Date: 01/20/2020
# ===========================================================

import selenium
import os
import unittest
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.select import Select

#Variable Definitions NEED TO MAKE
#find_elements_by_name
#find_elements_by_xpath
#find_elements_by_link_text
#find_elements_by_partial_link_text
#find_elements_by_tag_name
#find_elements_by_class_name
#find_elements_by_css_selector


#URL Variables
login_url = 'https://www.accuplacer.org/'
redirect_url = 'https://www.accuplacer.org/api/home.html#/'
reports_scheduler_url = 'https://www.accuplacer.org/api/home.html#/reportScheduler'
custom_reports_url = 'https://www.accuplacer.org/api/home.html#/customReports'

#WebDriver Path
browser = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\chromedriver.exe")

#Parent URL
browser.get("https://www.accuplacer.org")

# Authentication
# Credentials NEEDS TO BE ENCRYPTED AND NOT BAKED INTO THE SCRIPT NEEDS UNIT TEST
username = browser.find_element_by_id("login")
password = browser.find_element_by_id("password")
username.send_keys("##############")
password.send_keys("##############")
#browser.send_keys(Keys.ENTER)
#browser.send_keys(Keys.RETURN)

# Work on Notifications Window Clause
# Need a step for when notifications appear to click "Submit" option
# <button type="button" ng-show="updateWhatsNewFlag == 'failure'" translate="submit" class="btn btn-sm btn-success ng-scope" ng-click="updateShowWhatsNewFlag()" style="">Submit</button>

# Need a step to close if the notification popup window is present
# <button type="button" class="btn btn-default ng-scope" data-dismiss="modal" ng-click="clearMessages()" translate="common.btn.close">Close</button>

# Authentication submit.click()
#browser.find_element_by_css_selector('.btn.btn-lg.btn-primary').click()
element = WebDriverWait(browser, 20).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn.btn-lg.btn-primary.pull-left")))
element.click();

#Navigate to CustomReports XPATH=//*[@id="leftNav"]/ul/li[11]/ul/li[9]/a
#browser.find_element_by_xpath('//*[@id="leftNav"]/ul/li[11]').click()


# Make the report by selecting objects
#obj_report = Select(browser.find_element_by_name("Reports"))
element = WebDriverWait(browser, 20).until(
        EC.element_to_be_clickable((By.CSS_XPATH, "*[@id="leftNav"]/ul/li[11]/ul/li[9]/a")))
element.click();

Каждый раз, когда я пытаюсь использовать xpath, он ничего мне не дает и в основном говорит, что его не существует.

Ответы [ 3 ]

0 голосов
/ 24 января 2020

Пожалуйста, попробуйте ниже код, используя xpath с веб-драйвером explicit wait.

element = WebDriverWait(browser, 20).until(
EC.element_to_be_clickable((By.XPATH, "//a[contains(@href, '/customReports')]")))
element.click();

вам нужно ниже импорта

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

ИЛИ

Не рекомендуется, но в большинстве случаев это рабочее решение (попробуйте щелкнуть сценарием Java, но без ожидания, так как это может быть неудачным при ожидании)

element=browser.find_element(By.XPATH, "//a[contains(@href, '/customReports')]")
browser.execute_script("arguments[0].click();", element)
0 голосов
/ 24 января 2020

Итак, я нашел решение. Решение состоит в том, что мне пришлось сначала перейти к отчетам, а затем перейти к дочернему элементу пользовательских отчетов. Я использовал Link_Text вместо этого.

element = WebDriverWait(browser, 20).until(
        EC.element_to_be_clickable((By.LINK_TEXT, "Reports")))
element.click();

element = WebDriverWait(browser, 20).until(
                EC.element_to_be_clickable((By.LINK_TEXT, "Custom Reports")))
element.click();

Я ценю всю вашу помощь, ребята, @DebanjB и @Muzzamil, я сомневаюсь, что без их руководства я не смог бы узнать, как это сделать! Очень ценим вас двоих.

0 голосов
/ 24 января 2020

Требуемый элемент является элементом Angular, чтобы найти его, и click() на элементе, который вам нужно вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любой из следующие Стратегии локатора :

  • Использование CSS_SELECTOR:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "li>a[href$='customReports'][translate*='CustomReports']"))).click()
    
  • Использование XPATH:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//li/a[contains(@href,'customReports') and contains(@translate, 'CustomReports')]"))).click()
    
  • Примечание : Вы должны добавить следующие импорта:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
...