Introduction¶
- Python library provides page factory approach to implement page object model in selenium
- A Page Factory is one way of implementing a Page Object Model. In order to support the Page Object pattern.
- As in Java we are using @findBy, here we are declaring all web element in dictionary.
Dictionary keys become WebElement / class member variable with having all extended WebElement methods.
Github Project Page¶
Main Features¶
- Initialise all the webElements declared in Point at a time.
- All WebElements methods are re-define to add extra features eg- click method extended to have explicit wait for element to be clickable.
- Cent percent unittest coverage.
- Supports Selenium 4 ActionChains methods
- Now Support Appium for mobile testing
- Raised custom Page factory exceptions
Pre-Requisite¶
Every Page in Page Object Model should have WebDriver object as class member as shown below:
class PageClass(PageFactory):
def __init__(self,driver):
self.driver = driver
self.timeout = 15 #(Optional - Customise your explicit wait for every webElement)
self.highlight = True #(Optional - To highlight every webElement in PageClass)
self.mobile_test = False #(Optional - Added for Appium support)
Extended WebElements Methods¶
set_text | get_text |
clear_text | click_button |
double_click | get_list_item_count |
select_element_by_text | select_element_by_index |
select_element_by_value | get_all_list_item |
get_list_selected_item | highlight |
is_Enabled | is_Checked |
getAttribute | hover |
visibility_of_element_located | invisibility_of_element_located |
element_to_be_clickable | execute_script |
context_click | text_to_be_present_in_element |
click_and_hold | release |
Note
Every WebElement will be created after verifying it’s Presence and visibility on Page at Run-Time.
Examples¶
Python - Unittest¶
Inside test_Login.py:
import unittest
from selenium import webdriver
from seleniumpagefactory.Pagefactory import PageFactory
class LoginPage(PageFactory):
def __init__(self,driver):
# It is necessary to to initialise driver as page class member to implement Page Factory
self.driver = driver
# define locators dictionary where key name will became WebElement using PageFactory
locators = {
"edtUserName": ('ID', 'user_login'),
"edtPassword": ('NAME', 'pwd'),
"btnSignIn": ('XPATH', '//input[@value="Log In"]')
}
def login(self):
# set_text(), click_button() methods are extended methods in PageFactory
self.edtUserName.set_text("<USERNAME>") # edtUserName become class variable using PageFactory
self.edtPassword.set_text("<PASSWORD>")
self.btnSignIn.click_button()
class LoginTest(unittest.TestCase):
def test_Login(self):
driver = webdriver.Chrome()
driver.get("https://s1.demo.opensourcecms.com/wordpress/wp-login.php")
pglogin = LoginPage(driver)
pglogin.login()
if __name__ == "__main__":
unittest.main()
Python - Pytest¶
Inside test_Login.py:
import pytest
from selenium import webdriver
from seleniumpagefactory.Pagefactory import PageFactory
def test_Login():
driver = webdriver.Chrome("")
driver.get("https://s1.demo.opensourcecms.com/wordpress/wp-login.php")
pglogin = LoginPage(driver)
pglogin.login()
class LoginPage(PageFactory):
def __init__(self,driver):
# It is necessary to to initialise driver as page class member to implement Page Factory
self.driver = driver
# define locators dictionary where key name will became WebElement using PageFactory
locators = {
"edtUserName": ('ID', 'user_login'),
"edtPassword": ('NAME', 'pwd'),
"btnSignIn": ('XPATH', '//input[@value="Log In"]')
"lnkPost": ('XPATH', '//div[contains(text(),"Posts")]'),
"lstAction": ('ID', 'bulk-action-selector-top')
}
def login(self):
# set_text(), click_button() methods are extended methods in PageFactory
self.edtUserName.set_text("<USERNAME>") # edtUserName become class variable using PageFactory
self.edtPassword.set_text("<PASSWORD>")
self.btnSignIn.click_button()
WebElement Methods Usage¶
set_text¶
To perform set text operation:
class LoginPage(PageFactory):
def login(self):
self.edtUserName.set_text("opensourcecms")
get_text¶
To get text from edit box:
class LoginPage(PageFactory):
def login(self):
text_from_element = self.edtUserName.get_text()
clear_text¶
To clear text from edit box:
class LoginPage(PageFactory):
def login(self):
self.edtUserName.clear_text()
click_button¶
To Click on any WebElement:
class LoginPage(PageFactory):
def login(self):
self.btnSignIn.click_button()
click_and_hold¶
To click_and_hold on Element:
class LoginPage(PageFactory):
def login(self):
self.btnSignIn.click_and_hold()
release¶
Releasing a held mouse button on an element:
class LoginPage(PageFactory):
def login(self):
self.btnSignIn.release()
get_list_item_count¶
Get list item count:
class customPage(PageFactory):
def perform_list_operation(self):
list_item_count = self.lstAction.get_list_item_count()
select_element_by_text¶
To Select list item by using visible text:
class customPage(PageFactory):
def perform_list_operation(self):
self.lstAction.select_element_by_text("India")
select_element_by_index¶
To Select list item by using index:
class customPage(PageFactory):
def perform_list_operation(self):
self.lstAction.select_element_by_index(0)
select_element_by_value¶
To Select list item by using webElement value property:
class customPage(PageFactory):
def perform_list_operation(self):
self.lstAction.select_element_by_value("country India")
get_all_list_item¶
Get all list items:
class customPage(PageFactory):
def perform_list_operation(self):
list_items = self.lstAction.get_all_list_item()
get_list_selected_item¶
Get selected list item:
class customPage(PageFactory):
def perform_list_operation(self):
selected_list_item = self.lstAction.get_list_selected_item()
hover¶
To hover on any WebElement:
class customPage(PageFactory):
def login(self):
self.btnSignIn.hover()
is_Checked¶
Verify RadioButton and CheckBox:
class customPage(PageFactory):
def checkbox_radiobutton_operation(self):
checkBox_is_selected = self.chkGender.is_Checked()
is_Enabled¶
Verify Enable state of WebElemnt:
class customPage(PageFactory):
def checkbox_radiobutton_operation(self):
checkBox_is_enabled = self.chkGender.is_Enabled()
getAttribute¶
Get HTML attribute value of WebElemnt:
class customPage(PageFactory):
def link_operation(self):
title_attribute = self.nextLink.getAttribute("title")