在进行自动化测试程序的设计时,为了解决代码冗余、可读性差、复用性低以及维护成本高的问题,常常需要采用更高效的设计模式,目前主要有关键字驱动与POM设计模型两种框架设计模式,其中关键字驱动的设计模式出现较早,主要是利用关键字对selenium接口进行二次封装,测试环境的不同步骤就转换为不同的关键字,提高了代码的可读性、复用性以及可维护性,降低了代码冗余。
对百度搜索的基本功能进行封装,主要实现输入特定内容,获取搜索结果,打印结果的名称与链接,并打开对应网页,具体代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
class KeyWordsTest:
# 打开浏览器
def open_browser(self,browser):
browser = browser.capitalize()
if browser in ["Chrome","Edge","Firefox"]:
##利用反射的方式获取浏览器驱动
self.driver = getattr(webdriver,browser)()
self.driver.maximize_window() #窗口最大化
self.driver.implicitly_wait(5)
else:
raise ValueError("未检测到支持的浏览器类型")
# 加载网页
def load_url(self,url):
self.driver.get(url)
self.driver.implicitly_wait(5)
# 定位元素
def locate_element(self,loc):
# 使用*提取元组中的元素
return self.driver.find_element(*loc)
# 定位元素列表
def locate_elements(self,loc):
# 使用*提取元组中的元素
return self.driver.find_elements(*loc)
#输入信息
def input(self,loc,value):
self.locate_element(loc).send_keys(value)
self.driver.implicitly_wait(1)
#点击操作
def click(self,loc):
self.locate_element(loc).click()
self.driver.implicitly_wait(5)
if __name__ == '__main__':
content = 'selenium'
ktest = KeyWordsTest()
ktest.open_browser("edge")
ktest.load_url("https://www.baidu.com/")
ktest.input((By.ID,"kw"),content)
ktest.click((By.ID,"su"))
results = ktest.locate_elements((By.XPATH,"//a[contains(string(), \'%s\')]"%(content)))
for result in results:
if result.get_attribute("href"):
print(result.get_attribute("text").strip())
# 搜索结果的标题
title = result.get_attribute("text").strip()
# 搜索结果的网址
link = result.get_attribute("href")
print(f"Title: {title}, link is: {link} \n")
result.click()
在上述实验中可以看出,搜索结果的xpath或者css selector的提取比较繁琐,如何快速有效地找到不同搜索结果通用的xpath或者css selector成为首先要解决的问题。因此可以在浏览器的扩展应用商店中输入xpath或者css selector查找相应的扩展,安装完成即可,此处以xpath selector插件为例,点击插件,此时在浏览器上方会出现如下显示窗口:

接着按着shift按钮,将鼠标左键放置在搜索结果上即可出现xpath或者css selector的字符串,也可以点击红色框中的按钮自行修改,修改完成后被选中的搜索结果会高亮显示。