我正在尝试为我的自动测试编写一个自定义框架,但遇到了一个问题:
login_page_locators.py
id_password_input = (By.ID, 'password-input')
pages.py
import allure
from v2_tests.locators.login_page_locators import *
from selenium.webdriver.remote.webdriver import WebDriver as browser
class LoginPage:
def click_login_field(self):
with allure.step(''):
browser.find_element(*id_login_input).click()
return self
经理.py
from v2_tests.pages.login_page import LoginPage
class ClientManager:
def __init__(self):
self.login_page = LoginPage()
client = ClientManager()
和我的 test_file.py
from v2_tests.manager.eo_manager import client
def test_positive_login(open_env):
client.login_page.click_login_field()
执行测试时,我看到:
self = 'id', by = 'login-input', value = None
如何才能成功定位这个元素?
我的猜测是这是一个时间问题。我会在您的点击声明中添加
WebDriverWait
。
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.ID, 'password-input'))).click()
不要将所有定位器都放入
login_page_locators.py
。不要将所有页面对象类转储到 pages.py
中。每个网站页面都应该有自己的 .py
文件和自己的类,例如login_page.py
应包含 class LoginPage
并且登录页面的所有定位器都应在那里定义。
登录页面.py
import allure
from v2_tests.locators.login_page_locators import *
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webdriver import WebDriver as browser
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
class LoginPage:
password_locator = (By.ID, 'password-input')
# all locators for the login page are defined here
def click_login(self):
wait = WebDriverWait(browser, 10)
with allure.step(''):
wait.until(EC.element_to_be_clickable(LoginPage.password_locator)).click()
return self
请参阅页面对象模型上的 Selenium 文档。代码示例是 Java 而不是 Python,但它们至少会给您如何正确创建页面对象的基本概念。