关于 Python 页面对象模型的查询
Queries regarding page object model with Python
我已经尝试在 Python 中实现页面对象模型。我有两个问题:
- 为什么浏览器在测试执行期间启动了三次?是因为我在每个测试
verify_login_failure
和 verify_login_success
中都创建了新的页面对象吗?这可能是因为我的 driver.get()
被错误地放置在我的 BasePage
class 中。请指教
- 我该打电话到哪里
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")
Why does the browser launch thrice my test run? Is it because I'm making new page objects in each of the tests verify_login_failure and verify_login_success? This could be because my driver.get() is wrongly placed in my BasePage class. Please advise.
每次初始化页面时,父class BasePage 的构造函数也会初始化。如果你想有一个地方用于驱动程序初始化,那么我建议从 LoginTests
扩展 BasePage(当然重命名)
Where shall I call driver.quit() in order end my test suite execution gracefully after all the tests are completed?
最好的方法是在 setup_suite() 中初始化浏览器会话并在 teardown_suite() 中退出浏览器会话。至少我们在 Java 中这样做,这种格式允许我们 运行 并行测试。
将我的测试 class 更改为类似下面的内容很有帮助。
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()
我已经尝试在 Python 中实现页面对象模型。我有两个问题:
- 为什么浏览器在测试执行期间启动了三次?是因为我在每个测试
verify_login_failure
和verify_login_success
中都创建了新的页面对象吗?这可能是因为我的driver.get()
被错误地放置在我的BasePage
class 中。请指教 - 我该打电话到哪里
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")
Why does the browser launch thrice my test run? Is it because I'm making new page objects in each of the tests verify_login_failure and verify_login_success? This could be because my driver.get() is wrongly placed in my BasePage class. Please advise.
每次初始化页面时,父class BasePage 的构造函数也会初始化。如果你想有一个地方用于驱动程序初始化,那么我建议从 LoginTests
扩展 BasePage(当然重命名)Where shall I call driver.quit() in order end my test suite execution gracefully after all the tests are completed?
最好的方法是在 setup_suite() 中初始化浏览器会话并在 teardown_suite() 中退出浏览器会话。至少我们在 Java 中这样做,这种格式允许我们 运行 并行测试。
将我的测试 class 更改为类似下面的内容很有帮助。
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()