无法从 Orange HRM 站点的 UserRole 下拉列表中选择 Admin 或 ESS 选项

问题描述 投票:0回答:1

我是 Selenium 和 python 的新手,正在从头开始使用 pytest 创建一个框架。

网址
https://opensource-demo.orangehrmlive.com/web/index.php/auth/login

用户名和密码记录在测试站点登录页面(及下方)上:
用户名:管理员
密码:admin123

我无法单击“用户角色”字段的“管理员”或“ESS”选项。
HTML for the dropdown

大部分数据来自Excel workbook

我的代码如下

test_addUser.py

import time
import pytest
import self
from PageObject.LoginPage import LoginPage
from PageObject.AddUserPage import addUserPage
from TestData.LoginPageData import DataLoginPage
from Utlities.BaseClass import BaseClass

class TestValidateAddUser(BaseClass):
    def test_addUser(self, getData):
        lgnPage = LoginPage(self.driver)
        lgnPage.addUsername().send_keys(getData["Username"])
        lgnPage.entrePassword().send_keys(getData["Password"])
        lgnPage.submitBtn().click()
        self.verifyClickElement(addUserPage.adminbtn)
        adminUser = addUserPage(self.driver)
        adminUser.clickAddbtn().click()
        self.verifyPresenceOfAllEle(adminUser.UserRole()).click()
        self.visibilityByElement(adminUser.dropDownOpt()).click()
        self.verifyClickElement(adminUser.clickDrpOptions()).click()
        time.sleep(5)

    @pytest.fixture(params=DataLoginPage.getTestData("addUser"))
    def getData(self, request):
        return request.param''']

添加用户页面.py

from selenium.webdriver.common.by import By
class addUserPage:
    def __init__(self, driver):
        self.driver = driver

        adminbtn = (By.XPATH, "//span[text()='Admin']")
        addbtn = (By.XPATH, "//button[@class='oxd-button oxd-button--medium oxd-button--secondary']")
        addUserRole = (By.XPATH, "//div[@class='oxd-grid-item oxd-grid-item--gutters'])[1]")
        dropDownOptions = (By.XPATH, "//div[@role='listbox']")
        selectOptions = (By.XPATH, "//div[@role='listbox']//span[text()='ESS']")
        empName = (By.XPATH, "//label[contains(., 'Employee Name')]//following::div[1]")
        StatusSel = (By.XPATH, "//label[contains(., 'Status')]//following::div[1]//div[@class='oxd-select-   text-input']")
        addUserName = (By.XPATH, "//label[contains(., 'Username')]//following::div[1]")
        addPassword = (By.XPATH, "//label[contains(., 'Password')]//following::div[1]")
        addCPassword = (By.XPATH, "//label[contains(., 'Confirm Password')]//following::div[1]")
        btnSave = (By.XPATH, "//div[@class = 'oxd-form-actions']/button[2]")

    def clickAdmin(self):
        return self.driver.find_element(*addUserPage.adminbtn)

    def clickAddbtn(self):
        return self.driver.find_element(*addUserPage.addbtn)

    def UserRole(self):
        return self.driver.find_element(*addUserPage.addUserRole)

    def dropDownOpt(self):
        return self.driver.find_element(*addUserPage.dropDownOptions).__getattribute__('outerHTML')

    def clickDrpOptions(self):
        return self.driver.find_element(*addUserPage.selectOptions)`

基类.py

import pytest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait

@pytest.mark.usefixtures("setupBrowser")
class BaseClass:
    def verifyTextPresence(self, text):
        element = WebDriverWait(self.driver, 15).until(
            expected_conditions.presence_of_element_located((By.XPATH, text)))

    def verifyPresenceOfAllEle(self, text):
        element = WebDriverWait(self.driver, 10).until(
            expected_conditions.presence_of_all_elements_located((By.XPATH, text)))

    def verifyClickElement(self, locator):
        element = WebDriverWait(self.driver, 10).until(
            expected_conditions.element_to_be_clickable(locator))
        element.click()

    def selectOptionByText(self, locator, text):
       sel = Select(locator)
       sel.select_by_visible_text(text)

    def visibilityByElement(self, text):
       drpDwnlist = WebDriverWait(self.driver, 10).until(
           expected_conditions.visibility_of_all_elements_located((By.XPATH, text)))
       drpDwnlist.click()

我可以单击下拉列表,但无法使用多次 XPath 尝试来选择所需的值。我在 BaseClass.py 中创建了一个可重用的函数,但出现错误。我希望能够根据 Excel 中存在的数据选择下拉列表,例如使用 Excel 中的“ESS”值。

python selenium-webdriver pytest
1个回答
0
投票

您的页面对象还不错。比我在这里看到的大多数都要好,但我有一些建议和一些修复:

  1. 不要传回页面上的元素,例如不要只是为了单击而传回登录页面上的“提交”按钮。在

    Login(self, username, password)
    中创建一个方法
    LoginPage.py
    ,使用提供的信息填写用户名和密码字段,然后单击提交按钮。页面对象应该为页面提供“漂亮”的界面,同时隐藏页面本身的详细信息。允许在页面对象之外访问元素会破坏该模型。

  2. 在您的 BaseClass 中,不要限制用户只能使用 XPath。传入

    By
    定位器而不是字符串
    text
    。这样您就可以向任何定位器类型开放 BaseClass 方法,例如By.ID 或 By.CSS_SELECTOR 应该优先于 XPath。你用一些方法来做,但并不一致。

  3. 您的某些 BaseClass 方法没有多大意义,例如它们是提供的 Selenium 方法的单行包装,例如

    verifyTextPresence()
    只是一个
    WebDriverWait
    。如果您不做任何更复杂的事情,只需将
    WebDriverWait
    放入页面对象本身即可。

  4. 使用更准确、更具描述性的方法名称。例如,

    verifyClickElement()
    不验证任何内容......它实际上只是单击该元素。在这种情况下,就叫它
    click()
    吧。
    visibilityByElement()
    实际上也单击了一个元素,因此它与上面的内容重复。顺便说一句,该方法不起作用......您使用
    EC..visibility_of_all_elements_located()
    返回一组元素,而不仅仅是一个,然后您执行
    drpDwnlist.click()
    ,这将引发异常,因为您无法单击集合。您可以这样做
    drpDwnlist[0].click()
    但如果您要这样做,那么请将您的
    EC
    改为单数版本。


我有一个时不时使用的框架,所以我只是创建了页面对象并测试以我的格式匹配您的场景并让它工作......包括设置用户角色和“添加用户”页面上的所有其他字段。

注意:您需要安装 pytest,如果您想并行运行测试,则需要安装 pytest-xdist。

我为“添加用户”下拉列表创建了枚举,只是因为我更喜欢它们来尝试处理字符串,因为这样可以避免拼写错误、大写问题等。您显然不使用它们,但我强烈建议在此类情况下使用它们.

下面有很多文件,每个文件都有标签。

© www.soinside.com 2019 - 2024. All rights reserved.