如何正确地在Selenium中查找元素
我正在为我的自动测试写一个自定义框架,但遇到了一些问题:
这是我的登录页面定位器文件:login_page_locators.py
id_login_input = (By.ID, 'login-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
还有我的管理文件:manager.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
这是我遇到问题的截图: 截图
我该如何成功找到这个元素呢?
1 个回答
0
我猜这可能是个时机问题。我建议你在点击操作前加一个 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
,并且所有与登录页面相关的定位器都应该在这里定义。
login_page.py
import allure
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
class LoginPage:
def __init__(self, driver):
self.password_locator = (By.ID, 'password-input')
self.driver = driver
def click_login_field(self):
wait = WebDriverWait(self.driver, 10)
with allure.step(''):
wait.until(EC.element_to_be_clickable(self.password_locator)).click()
return self
可以查看Selenium的文档,了解 页面对象模型。虽然代码示例是Java而不是Python,但至少能让你明白如何正确创建页面对象的基本概念。