class SearchPage: def __init__(self, driver): # 实例化Base类 self.base_obj = Base(driver) """页面元素""" # 搜索按钮 self.search_btn = (By.ID, "com.android.settings:id/search") # 输入框 self.search_input = (By.ID, "android:id/search_src_text") # 搜索结果 self.search_result = (By.ID, "com.android.settings:id/title") def click_search_btn(self): """点击搜索按钮""" self.base_obj.click_ele(self.search_btn) def send_search_text(self, text): """ 输入搜索内容 :param text: 需要输入的搜索内容 :return: """ self.base_obj.send_ele(self.search_input, text) def get_search_result(self): """获取搜索结果""" # 返回定位对象列表目的??[对象1, 对象2.....] -> [对象1文本,对象2文本....] results = self.base_obj.search_eles(self.search_result) return [i.text for i in results]
class Test_Search: def setup_class(self): """声明driver""" # server 启动参数 desired_caps = { 'platformName': 'Android', 'platformVersion': '5.1', 'deviceName': 'sanxing', 'appPackage': 'com.android.settings', 'appActivity': '.Settings' } # 声明我们的driver对象 self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # 实例化Base类 self.base_obj = Base(self.driver) # 页面元素 # 搜索按钮 self.search_btn_id = (By.ID, "com.android.settings:id/search") # 搜索输入框 self.search_input_id = (By.ID, "android:id/search_src_text") # 搜索结果 self.search_result_ids = (By.ID, "com.android.settings:id/title") def teardown_class(self): """退出driver""" self.driver.quit() # 因为只需要运行一次 并且是依赖方法,所以使用fixture工厂函数 @pytest.fixture(scope="class", autouse=True) def click_search_btn(self): """点击搜索按钮 并且 点击一次""" self.base_obj.click_ele(self.search_btn_id) @pytest.mark.parametrize("search_data, exp_data", [("1", "休眠"), ("i", "IP地址"), ("m", "MAC地址")]) def test_search_text(self, search_data, exp_data): """ 搜索测试方法 :param search_data: 输入内容 :param exp_data: 预期结果 :return: """ # 输入框输入内容 self.base_obj.send_ele(self.search_input_id, search_data) # 获取结果 results = self.base_obj.search_eles(self.search_result_ids) # 断言 assert exp_data in [i.text for i in results]