Package: pythium
Pythium中文|English基于 Python 的 Page Factory 设计模式测试库, 类似于Java的Page Factory模式，旨在减少代码冗余，简单易用，具有高度的可扩展能力。支持以@annotation的方式定义元素支持同一个元素多种定位方式支持动态的定位方式安装pip install pythium用法使用单个定位元素find_byios_find_byandroid_find_byfind_by用于Web平台,ios_find_by和android_find_by分别适用于苹果和安卓平台;例子:find_by(css=".search")使用多个定位元素，元素之间为or的关系，按顺序查找:find_allios_find_allandroid_find_all例子:@find_all(by(css=".icon-logo1"), by(id="icon"));首先查找元素by(css=".icon-logo1"), 如果找到则返回WebElement;如果没找到则通过by(id="icon")继续找, 如果找到则返回WebElement;最后没找到则抛出异常Exception.Page object代码样例:frompythiumimportfind_by,android_find_by,ios_find_byfrompythiumimportfind_all,ios_find_all,android_find_all,Page,byfromappium.webdriver.webelementimportWebElementasMobileElementfromselenium.webdriver.remote.webelementimportWebElementfromtypingimportAny,ListclassLoginPage(Page):@find_by(css=".search")@ios_find_by(ios_predicate='value == "Search something"')@android_find_by(android_uiautomator='resourceId("com.app:id/search_txtbox")')defsearch_input(self)->WebElement:...@property@find_by(css=".search")@ios_find_by(ios_predicate='value == "Search something"')@android_find_by(android_uiautomator='resourceId("com.app:id/search_txtbox")')defsearch_input_with_property(self)->WebElement:...@property@find_all(by(css=".icon-logo1"),by(css=".icon-logo"))deffind_all_web_test(self)->WebElement:returnAny@property@ios_find_all(by(ios_predicate='value == "Search something"'),by(ios_predicate='value == "Search result"'))@android_find_all(by(android_uiautomator='resourceId("com.app:id/search_txtbox")'),by(android_uiautomator='resourceId("com.app:id/search_txtbox")'))deffind_all_mobile_test(self)->WebElement:returnAny# for dynamical locator@find_by(xpath="//div[{n}]/a[{k}]/div[{m}]/{f}")@ios_find_by(xpath="//div[1]/a[{n}]/div[{k}]")defdynamical_locator(self,n,k,m=4,f=6)->WebElement:...# for list WebElements@find_by(css=".login")deflist_web_elements(self)->List[MobileElement]:...def_is_loaded(self):print("implement something...")if__name__=='__main__':frompythiumimportBrowsersdriver=Browsers.chrome()login=LoginPage(driver)# no @propertylogin.search_input.click()# with @propertylogin.search_input_with_property.click()# for dynamical locatorlogin.dynamical_locator(2,3,4,5).click()# for list WebElementprint(len(login.list_web_elements()))非Page object代码样例:frompythiumimportFalcon,Element,PagefrompythiumimportBrowsersdriver=Browsers.chrome()Ele=Falcon(Element,driver)page=Page(driver)page.goto("https://www.baidu.com/")search_input=Ele(id_="kw")search_button=Ele(id_='su')search_input.send_keys("selenium")search_button.click()page.wait(5).expect.to_have_title("selenium_百度搜索")使用自定义Element使用自定义Element的好处是，不用额外的封装一些公用的方法(额外的等待、元素是否存在等)；如果遇到一些无法处理的或者没有的方法，则需要根据自己的需求，继承Element类，定义自己的方法调用即可使用时只需把函数返回类型定义为Element, Elements(或者自定义的类名),替换WebElement, MobileElement代码样例：frompythiumimportfind_by,find_allfrompythiumimportPage,by,Element,ElementsfromtypingimportAnyfrompythiumimportBrowsersclassBaiDuPage(Page):def_is_loaded(self):pass@property@find_by(id_="kw")defsearch_input(self)->Element:...@property@find_by(id_='su')defsearch_button(self)->Element:...@find_by(id_="kw")defsearch_input_no_property(self)->Element:returnAny@property@find_all(by(id_="kw"),by(css=".s_ipt"))defsearch_input_find_all(self)->Element:...# for dynamical locator@property@find_by(xpath="//div[{n}]/a[{k}]/div[{m}]/{f}")# @find_by(xpath="//div[1]/a[2]/div[3]/")defdynamical_locator(self,n,k,m=4,f=6)->Element:...# for list Elements@property@find_by(css=".mnav")deflist_elements(self)->Elements:...if__name__=='__main__':driver=Browsers().chrome()baidu=BaiDuPage(driver)baidu.goto("https://www.baidu.com/")print(baidu.list_elements.index(0).text)baidu.search_input.send_keys("selenium")# baidu.search_input_no_property().send_keys("selenium")baidu.search_button.click()baidu.wait(5).expect.to_have_title('selenium_百度搜索')元素定位参考Css 用法Xpath 用法