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
===================
https://github.com/NayakwadiS/selenium-page-factory
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
Installation
=============
pip install::
pip install selenium-page-factory
Update
===============
To updated to the lasted version::
pip install selenium-page-factory --upgrade
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
============================
.. raw:: html
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 |
hover_with_offset |
Coming soon... |
============================
.. 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("") # edtUserName become class variable using PageFactory
self.edtPassword.set_text("")
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("") # edtUserName become class variable using PageFactory
self.edtPassword.set_text("")
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")