selnium PageObject (PO)示例
noPO 定位器和方法混在一起;一点web元素修改,全部GG,不够优雅
from selenium import webdriver from selenium.webdriver.common.by import By def test_eight_components(): driver = webdriver.Chrome() # 打开百度 driver.get("https://baidu.com") # 从网页获得标题 title = driver.title # 百度的title是 '百度一下,你就知道' # 断言 将获取的标题和预期标题做对比 assert title == "百度一下,你就知道" # 隐式地等待,直到找到元素 全局设置 driver.implicitly_wait(0.5) # 发送命令 查找元素 text_box = driver.find_element(by=By.ID, value="kw") submit_button = driver.find_element(by=By.ID, value="su") # 操作元素 text_box.send_keys("Selenium") # 在搜索框输入"Selenium" submit_button.click() # 点击发送 # 搜索前等待0.5秒 # 获得元素 message = driver.find_element(by=By.LINK_TEXT, value="百度首页") # 变量存储页面获得的值 value = message.text assert value == "百度首页" driver.quit()
将定位元素和方法分离;一套定位器,支持多种参数传入;如果页面元素发生更改,仅需要更新定位器;优雅,实在优雅
第一种,没有保护,不包含条件判断 ,不管页面有没有这个元素 都发送请求
from selenium import webdriver from selenium.webdriver.common.by import By class BaiduHomePage: def __init__(self, driver): self.driver = driver self.text_box = (By.ID, "kw") self.submit_button = (By.ID, "su") self.message = (By.LINK_TEXT, "百度首页") def enter_search_text(self, text): self.driver.find_element(*self.text_box).send_keys(text) def click_submit_button(self): self.driver.find_element(*self.submit_button).click() def get_message_text(self): return self.driver.find_element(*self.message).text def get_title(self): return self.driver.title def test_eight_components(): driver = webdriver.Chrome() home_page = BaiduHomePage(driver) driver.get("https://baidu.com") assert home_page.get_title() == "百度一下,你就知道" home_page.enter_search_text("Selenium") home_page.click_submit_button() assert home_page.get_message_text() == "百度首页" driver.quit()
第二种,比较优雅,有条件保护,如果找不到不交互
from selenium import webdriver from selenium.webdriver.common.by import By # WebDriverWait是Selenium提供的一个等待工具, # 它可以用于等待特定条件的出现。 from selenium.webdriver.support.ui import WebDriverWait # EC是Selenium提供的内置条件类。 from selenium.webdriver.support import expected_conditions as EC # 使用WebDriverWait和条件方法EC的目的是确保在执行send_keys方法之前,输入框已经可见并且可以与之交互。 # 这样可以避免在输入文本之前出现元素不可见或不可交互的问题。这是一种良好的做法,可以提高测试的稳定性和可靠性。 ''' 在这个示例中,我们首先定义了一个名为BaiduHomePage的页面对象类, 它包含了页面中的元素和操作。 第一部分,初始化,init方法用于初始化页面对象类,定义了页面中的元素定位器。 第二部分,写方法,然后我们将测试代码中的操作转移到了BaiduHomePage类中对应的方法中。 在这些方法中,我们使用WebDriverWait类进行元素的等待和定位,并执行相应的操作。 第三部分,实例化调用 在test_eight_components函数中, 我们创建了一个BaiduHomePage类的实例home_page, 并通过该实例执行页面操作,而不是直接使用定位器和WebDriver对象。 通过使用页面对象模型,我们将测试代码中的页面操作抽象成了可重用的方法, 并将元素的定位和等待逻辑封装在页面对象类中。这样做提高了测试代码的可维护性和可读性, 同时也使得当页面发生变化时,只需要修改页面对象类的代码而不是每个测试方法中的代码 ''' class BaiduHomePage: def __init__(self, driver): # init初始化 传入驱动参数 self.driver = driver # 驱动 self.text_box = (By.ID, "kw") # 输入框的id self.submit_button = (By.ID, "su") # 提交按钮的id self.message = (By.LINK_TEXT, "百度首页") # 搜索结果包含的文字 def enter_search_text(self, text): # 在输入框输入,传入参数 文字 # 第一 # WebDriverWait是Selenium提供的一个等待工具, # 它可以用于等待特定条件的出现。 # 在这里,我们使用WebDriverWait来等待self.driver中的元素出现。 # 第二 # until(EC.visibility_of_element_located(self.text_box)):这是WebDriverWait的方法, # 它将一直等待,直到EC.visibility_of_element_located条件为真(即元素可见) # 第二 # EC是Selenium提供的内置条件类。 # visibility_of_element_located是一个条件方法,用于检查元素是否可见。 # 在这里,我们使用visibility_of_element_located来检查self.text_box元素是否可见 # 第四 # send_keys(text):这是一个用于向输入框发送文本的方法。在这里,我们将text参数作为文本发送到输入框中 WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(self.text_box)).send_keys(text) def click_submit_button(self): # 提交按钮 WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable(self.submit_button)).click() def get_message_text(self): # 获得搜索结果包含文字 return WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(self.message)).text def get_title(self): # 获得页面的标题 return self.driver.title def test_eight_components(): # 调用谷歌浏览器的驱动 driver = webdriver.Chrome() # 实例化一个home_page来调用BaiduHomePage类,传入驱动参数 home_page = BaiduHomePage(driver) # 打开百度 driver.get("https://baidu.com") # 调用实例化的home_page的获得标题方法get_title() == "百度一下,你就知道" assert home_page.get_title() == "百度一下,你就知道" # 调用实例化的home_page的输入框输入方法enter_search_text,传入参数 "Selenium" home_page.enter_search_text("Selenium") # 调用实例化的home_page的点击‘百度一下’方法 home_page.click_submit_button() # 实例化home_page方法的获得搜索结果页面方法get_message_text() =="百度首页" assert home_page.get_message_text() == "百度首页" driver.quit()