To simplify automation settings of each different platform, version, browser.
-
ChromeDriver
-
GeckoDriver
-
EdgeDriver (Chromium)
-
IEDriver -
...and Android, iOS (See With Appium section)
pip install pwdriver
config.ini
look like this.
[automation]
;if using remote webdriver, then local be false and url required.
local=true
url=http://localhost:4444
;target: chrome, gecko, edge, safari
target=chrome
Now, we can launch webdriver.
from pwdriver.core import WebDriverFactory
driver = WebDriverFactory.launch()
This way doesn't make and doesn't use configuration file, but calls setup method of the driver in your test code.
from selenium import webdriver
from pwdriver import core
core.setup_chromedriver()
driver = webdriver.Chrome()
from selenium import webdriver
from pwdriver import core
core.setup_geckodriver()
driver = webdriver.Firefox()
from selenium import webdriver
from pwdriver import core
core.setup_edgedriver()
driver = webdriver.Edge()
Page object models pattern makes our test cases more concise and readable.
The good news is, we can use Page Objects with this.
There is an example that searching for keyword on www.bing.com
and verifying url, title.
For using this, we are going to create modules that page object classes and test cases.
Modules that page elements and locators already implemented, so nevermind.
from selenium.webdriver.common.by import By
from pwdriver.page import BasePage
class BingPage(BasePage):
def __init__(self, driver):
super().__init__(driver)
self._url = 'https://www.bing.com'
self._locator = {
'input': (By.CSS_SELECTOR, 'input#sb_form_q'),
'search': (By.CSS_SELECTOR, 'label#search_icon')
}
def type_keyword(self, text) -> None:
self._by('input').send_keys(text)
def click_search(self) -> BasePage:
self._by('search').click()
return BingPage(BasePage)
from pwdriver.core import WebDriverFactory
from tests.pages.bing_page import BingPage
import unittest
class BrowserTest(unittest.TestCase):
def setUp(self):
self.driver = WebDriverFactory.launch()
def tearDown(self):
self.driver.quit()
def test_something(self):
page = BingPage(self.driver)
page.get()
keyword = 'chicken'
page.type_keyword(keyword)
page.submit_keyword()
self.assertIn(f'https://www.bing.com/search?q={keyword}', self.driver.current_url)
self.assertEqual(f'{keyword} - Search', self.driver.title)
if __name__ == '__main__':
unittest.main()
If we want to use logging or want to see what events occured in webdriver,
we can use get_logger()
or EventListener()
.
See below example code.
from selenium.webdriver.support.events import EventFiringWebDriver
from pwdriver.core import WebDriverFactory
from pwdriver.listener import EventListener
from pwdriver.util import get_logger
logger = get_logger('test')
core = WebDriverFactory.launch()
driver = EventFiringWebDriver(core, EventListener())
logger.info('WebDriver created.')
- Log level:
debug
,info
,warning
,error
,critical
- WebDriver event:
navigate
,execute script
- WebElement event:
find
,click
,change value
This package also includes wrapped appium's remote webdriver.
We could launch an appium driver using config.ini
file that contains capabilities.
See below configuration and example code.
[automation]
;if using appium, then local be false and url required.
local=false
url=http://localhost:4723
;target: android, ios
target=ios
[mobile]
;add capabilities for mobile testing.
platformVersion=15.5
deviceName=iPhone 13 mini
browserName=Safari
from pwdriver.core import WebDriverFactory
driver = WebDriverFactory.launch()