如何正确地在Selenium中查找元素

0 投票
1 回答
65 浏览
提问于 2025-04-12 18:14

我正在为我的自动测试写一个自定义框架,但遇到了一些问题:

这是我的登录页面定位器文件: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,但至少能让你明白如何正确创建页面对象的基本概念。

撰写回答