如何在Selenium中正确查找元素

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

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

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

如何才能成功定位这个元素?

python selenium-webdriver
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
并且登录页面的所有定位器都应在那里定义。

登录页面.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,但它们至少会给您如何正确创建页面对象的基本概念。

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