Как выполнить итерацию процессов загрузки в объектной модели Selenium Page, используя Python? - PullRequest
0 голосов
/ 14 апреля 2020

Я работаю над веб-приложением, которое требует, чтобы пользователь загружал определенные документы на одной странице перед отправкой заявки на проверку. После того, как пользователь нажал кнопку «Загрузить» и выбрал файл, начался процесс загрузки, и после его завершения рядом с кнопкой загрузки появился значок галочки. Я пытаюсь добиться того, чтобы я загружал необходимые документы и устанавливал значок галочки после завершения процесса загрузки.

Я поместил все локаторы кнопок загрузки и значков галочек в Locators.py, как показано ниже.

from selenium.webdriver.common.by import By

class Locators():
    ## -- Document upload button --
    DOCUMENT_1_BUTTON = (By.CSS_SELECTOR, 'div.body__individual > div:nth-child(1) > div.box__action > button')
    DOCUMENT_2_BUTTON = (By.CSS_SELECTOR, 'div.body__individual > div:nth-child(2) > div.box__action > button')
    DOCUMENT_3_BUTTON = (By.CSS_SELECTOR, 'div.body__individual > div:nth-child(3) > div.box__action > button')

    ## -- Check mark icon --
    DOCUMENT_1_CHECKMARK = (By.CSS_SELECTOR, 'div.body__individual > div:nth-child(1) > div.box__info > svg > g')
    DOCUMENT_2_CHECKMARK = (By.CSS_SELECTOR, 'div.body__individual > div:nth-child(2) > div.box__info > svg > g')
    DOCUMENT_3_CHECKMARK = (By.CSS_SELECTOR, 'div.body__individual > div:nth-child(3) > div.box__info > svg > g')      

Требуемый путь к файлу для загрузки, я поместил его в TestData.py, как показано ниже.

class TestData():
    # --- File Path ---
    DOC_1_PATH = "C:\\docs\\doc-1.pdf"
    DOC_2_PATH = "C:\\docs\\doc-2.pdf"
    DOC_3_PATH = "C:\\docs\\doc-3.pdf"

Чтобы повторить процесс загрузки, на странице и методе Pages.py, я написал this.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains as AC
import autoit

from Locators import Locators
from TestData import TestData

class BasePage():
    def __init__(self, driver):
        self.driver = driver

    # click the element whose locator is passed to it 
    def click(self, by_locator):
        WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator)).click()

    # upload document or file on web element whose locator and the file path is passed to it.
    def upload(self, by_locator, by_path_file):
        element = WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable(by_locator))
        AC(self.driver).move_to_element(element).click().perform()
        handle = "[CLASS:#32770; TITLE:Open]"
        autoit.win_wait(handle, 15)
        autoit.control_set_text(handle, "Edit1", by_path_file)
        autoit.control_click(handle, "Button1")

    # returns true or false depending upon visibility of element whose locator is passed to it
    def is_visible(self, by_locator):
        try:
            element = WebDriverWait(self.driver, 200).until(EC.visibility_of_element_located(by_locator))
            return bool(element)
        except TimeoutException:
            return False

class CreateApplicationPage(BasePage): # Page where the documents are required to upload
    def __instancecheck__(self, driver):
        super().__init__(driver)

   # --- Functions to upload document for each required document ---
    def upload_document_1(self):
        self.upload(Locators.DOCUMENT_1_BUTTON, TestData.DOCUMENT_1_PATH)
    def upload_document_2(self):
        self.upload(Locators.DOCUMENT_2_BUTTON, TestData.DOCUMENT_2_PATH)
    def upload_document_3(self):
        self.upload(Locators.DOCUMENT_3_BUTTON, TestData.DOCUMENT_3_PATH)

Последнее, для тестового файла Tests.py

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

from Locators import Locators
from TestData import TestData
from Pages import CreateApplicationPage

#Base class for the tests
class IMDGBaseTest(unittest.TestCase):
    def setUp(self):
        # Some setup here

    def tearDown(self):
        # close the browser window
        self.driver.quit()

class MainTest(BaseTest):
    def test_001_create_application(self):
        #Instantiating an object of CreateApplicationPage class and start to upload documents
        self.createApplicationPage = CreateEditApplicationPage(self.homePage.driver)

        # Upload reqired documents and assert a checkmark when the upload process is finished
        ## Document 1
        self.createApplicationPage.upload_document_1()
        self.assertTrue(self.createApplicationPage.is_visible(Locators.DOCUMENT_1_CHECKMARK))
        ## Document 2
        self.createApplicationPage.upload_document_2()
        self.assertTrue(self.createApplicationPage.is_visible(Locators.DOCUMENT_2_CHECKMARK))
        ## Document 3
        self.createApplicationPage.upload_document_3()
        self.assertTrue(self.createApplicationPage.is_visible(Locators.DOCUMENT_3_CHECKMARK))

Есть ли более эффективный способ повторения процесса загрузки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...