【问题标题】:Queries regarding page object model with Python使用 Python 查询有关页面对象模型的问题
【发布时间】:2018-08-07 11:57:30
【问题描述】:

我尝试在 Python 中实现页面对象模型。我有两个问题:

  1. 为什么在测试执行期间浏览器会启动三次?是因为我在每个测试verify_login_failureverify_login_success 中都创建了新的页面对象吗?这可能是因为我的driver.get() 被错误地放置在我的BasePage 类中。请告知。
  2. 我应该在哪里打电话 driver.quit() 为了在所有测试完成后优雅地结束测试套件执行?

这是我的代码:

#  Basepage.py

from selenium import webdriver


class BasePage(object):

    def __init__(self):
        self.driver = webdriver.Chrome(
            executable_path="chromedriver_mac")
        self.driver.get("http://automationpractice.com/index.php?controller=authentication&back=my-account")
        self.driver.implicitly_wait(5)


#  LoginPage.py

from selenium.webdriver.common.by import By

from page_object.pages.BasePage import BasePage


class Login(BasePage):
    email = (By.ID, "email")
    password = (By.ID, "passwd")
    sign_in_btn = (By.ID, "SubmitLogin")
    failure_message = (By.XPATH, "//li[contains(text(),'Authentication failed.')]")

    def set_email(self, email):
        email_element = self.driver.find_element(*Login.email)
        email_element.clear()
        email_element.send_keys(email)

    def set_password(self, password):
        password_element = self.driver.find_element(*Login.password)
        password_element.clear()
        password_element.send_keys(password)

    def click_sign_in_btn(self):
        sign_in_element = self.driver.find_element(*Login.sign_in_btn)
        sign_in_element.click()

    def is_failure_message_displayed(self):
        failure_message_element = self.driver.find_element(*Login.failure_message)
        return failure_message_element.is_displayed()

    def login(self, email, password):
        self.set_email(email)
        self.set_password(password)
        self.click_sign_in_btn()


#  MyAccountPage.py

from selenium.webdriver.common.by import By

from page_object.pages.BasePage import BasePage


class MyAccount(BasePage):
    my_account_text = (By.XPATH, "LoginPage.py")

    def is_my_account_text_displayed(self):
        my_account_text_element = self.driver.find_element(*MyAccount.my_account_text)
        return my_account_text_element.is_displayed()


#  LoginTests.py

import lemoncheesecake.api as lcc
from lemoncheesecake.matching import check_that, is_true

from page_object.pages.LoginPage import Login
from page_object.pages.MyAccountPage import MyAccount


@lcc.suite("Login page tests")
class LoginTests:

    def setup_suite(self):
        lcc.log_info("Inside setup")

    @lcc.test("check login failure")
    def verify_login_failure(self):
        login = Login()
        login.login(email="myemail@gmail.com", password="incorrectpasswd")
        check_that("Failure message is displayed", login.is_failure_message_displayed(), is_true())

    @lcc.test("check login success")
    def verify_login_success(self):
        login = Login()
        login.login(email="myemail@gmail.com", password="correctpasswd")
        my_account = MyAccount()
        check_that("My Account text is displayed", my_account.is_my_account_text_displayed(), is_true())

    def teardown_suite(self):
        lcc.log_info("Inside teardown")

【问题讨论】:

  • 在测试的最开始放置一个断点并运行它。单步执行每一行代码并观察执行流程。现在您将知道为什么在您的测试期间浏览器被创建了 3 次。

标签: python selenium pageobjects


【解决方案1】:

为什么浏览器会启动三次我的测试运行?是因为我在每个测试 verify_login_failure 和 verify_login_success 中都创建了新的页面对象吗?这可能是因为我的 driver.get() 被错误地放置在我的 BasePage 类中。请指教。

每次初始化页面时,父类 BasePage 的构造函数也会初始化。如果你想有一个地方进行驱动程序初始化,那么我提供从 LoginTests 扩展 BasePage(当然是重命名)

在所有测试完成后,我应该在哪里调用 driver.quit() 以优雅地结束我的测试套件执行?

最好的方法是在 setup_suite() 中初始化浏览器会话并在 teardown_suite() 中退出浏览器会话。至少我们是用 Java 做的,这种格式允许我们并行运行测试。

【讨论】:

  • 关于#1,我不明白您所说的“从LoginTests 扩展BasePage(当然是重命名)”到底是什么意思。我应该让LoginTests 成为BasePage 的子类吗?这不会违反页面对象设计模式吗?关于#2,如何访问setupteardown 方法中的驱动程序对象,以便分别初始化和退出浏览器会话?
【解决方案2】:

将我的测试类更改为类似下面的内容有所帮助。

import lemoncheesecake.api as lcc
from lemoncheesecake.matching import check_that, is_true
from selenium import webdriver

from core.common.constants import Global
from core.utils.fileutils import capture_screenshot
from pages.login_page import LoginPage
from pages.my_account_page import MyAccountPage


@lcc.suite("Login page tests")
class LoginTests(object):
    login, my_account, driver = None, None, None

    def setup_suite(self):
        lcc.log_info("Inside setup")
        self.driver = webdriver.Chrome(executable_path=Global.CHROME_DRIVER)
        self.login = LoginPage(driver=self.driver)
        self.my_account = MyAccountPage(driver=self.driver)

    @lcc.test("check login failure")
    def verify_login_failure(self):
        self.login.login(email="myemail@gmail.com", password="incorrectpasswd")
        check_that("Failure message is displayed", self.login.is_failure_message_displayed(), is_true())

    @lcc.test("check login success")
    def verify_login_success(self):
        self.login.login(email="myemail@gmail.com", password="correctpasswd")
        check_that("My Account text is displayed", self.my_account.is_my_account_text_displayed(), is_true())

    def teardown_test(self, test_name):
        lcc.log_info("Finished running test " + test_name)
        capture_screenshot(self.driver)

    def teardown_suite(self):
        lcc.log_info("Inside teardown")
        self.driver.quit()

【讨论】:

    猜你喜欢
    • 2018-02-20
    • 2011-06-22
    • 1970-01-01
    • 2019-02-23
    • 2022-01-26
    • 1970-01-01
    • 2018-09-13
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多