

nopo (not only page object 的缩写) 是一个关于 Page Object 模型(PO 模型,POM)的包,基于 Selenium,帮助你在 Web 测试中构建 POM。
项目地址 - GitHub | 项目地址 - Gitee
View README in English
查看开发该模块的历程
功能
- 定义、操作一个元素,或所有具有相同属性的元素,方法上类似于 Selenium,不过也扩充了一些功能
- 自动等待、寻找单个元素 / 所有元素
- 在元素中支持层叠的选择器
安装
使用方法
示例
一个简单的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| from selenium import webdriver from selenium.webdriver.common.keys import Keys
from nopo import El, Els, By, Pg
class GitHubPage(Pg):
textbox = El(By.XPATH, '//input[@aria-label="Search GitHub"]') main_page = El(By.TAG_NAME, 'main') user_a = El(By.CLASS_NAME, 'mr-1') name = El(By.XPATH, '//span[@itemprop="name"]')
def search_user(self, name): self.textbox.send_keys(name, clear=True) self.textbox.send_keys(Keys.ENTER) lis = Els(el=(self.main_page / El(By.XPATH, './/nav[1]') / El(By.TAG_NAME, 'a'))) lis[-1].click() self.user_a.click() assert self.name.value == 'Ding Junyao'
if __name__ == '__main__': driver = webdriver.Chrome() driver.maximize_window() driver.get('https://github.com/') gh_page = GitHubPage(driver) gh_page.search_user('DingJunyao') driver.quit()
|
定义
在有 driver
属性,且该属性指向 Selenium WebDriver 实例的类(如 nopo.Pg
类),可以定义为类属性:
1 2
| example_el = El(by, selector_str) example_els = Els(by, selector_str)
|
在其他不便使用类属性的场合,或者是想要自定义 WebDriver,可以使用 driver
参数:
1 2
| example_el = El(by, selector_str, driver=driver) example_els = Els(by, selector_str, driver=driver)
|
操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| el.text el.value el.exist el.exist_wait el.is_selected el.selectors_xpath el.elem el.elem_clickable el.elem_no_wait
el.options el.all_selected_options el.first_selected_option
el.click() el.clear(force=False) el.send_keys(keys, clear=False, force_clear=False) el.csk(keys, force_clear=False) el.nn_csk(keys, force_clear=False) el.get_attribute(attr) el.get_property(property_text) el.wait_for_click() el.wait_for_present()
el.select_by_value(value) el.select_by_index(index) el.select_by_visible_text(text) el.deselect_all() el.deselect_by_value(value) el.deselect_by_index(index) el.deselect_by_visible_text(text)
el.switch_in()
El.single_selector_to_xpath(by, selector)
|
层叠
使用 /
操作符链接多个元素,得到新元素。新元素的选择器为两者层叠而成:
1 2 3
| el1 = El(by1, selector_str1) el2 = El(by2, selector_str2) example_el = el1 / el2
|
example_el
的数据类型与 el1
相同,其选择器为 el1
的选择器下执行 el2
的选择器,类似于使用 Selenium 中的:
1 2
| el1 = driver.find_element.by(by1, selector_str1) example_el = el1.find_element.by(by2, selector_str2)
|
扩展
el
参数可用于转换类的类型,便于自定义类:
1 2 3 4
| class MyEl(El): pass
example_el = MyEl(el=el1 / el2)
|
构建
1 2 3 4 5
| pip install -r requirements.txt
python -m build
python3 -m build
|
未来计划
协议
Apache 协议 2.0 版