web自动化测试入门篇04——selenium+python基础方法封装_封装selenium的方法(2)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取


 


#### 2.1.1 开启浏览器



def open_browser(self, browser):
if browser == ‘chrome’:
options = webdriver.ChromeOptions()
exclude = [‘enable-automation’]
options.add_experimental_option(‘excludeSwitches’, exclude)
driver = webdriver.Chrome(chrome_options=options)
elif browser == ‘firefox’:
profile = webdriver.FirefoxProfile()
profile.set_preference(‘browser.download.dir’, ‘E:\FireFox_DL\’)
profile.set_preference(‘browser.download.folderList’, 2)
profile.set_preference(‘browser.helperApps.neverAsk.saveToDisk’, ‘application/zip’)
driver = webdriver.Firefox(firefox_profile=profile)
elif browser == ‘ie’:
driver = webdriver.Ie()
else:
driver = webdriver.Edge()
return driver


  这里解释一下,ChromeOptions()这个方法是chrome浏览器的参数对象,用来配置浏览器启动是的一些参数与属性,这里添加的是浏览器启动后不显示“正受到自动测试软件的控制”的提示,用法比较简单,add\_experimental\_option这边是添加试验性质的参数,另外比较常用的还有add\_argument,add\_extension(添加启动项、添加扩展)等方法。  
   FirefoxProfile()这个是用来指定火狐浏览器内用户设定档案,一般可以开启或关闭某些浏览器内的功能来达到我们的测试业务需求,如果你用selenium启动火狐的话都会默认新建一个这样的档案,那在代码中的话你可以指定档案的保存路径并在后续对其指定功能进行开启或关闭。


 


#### 2.1.2 检查URL


  封装的功能比较简单的,这里检查URL内是否含有http,大家可以根据自己的需求将判断逻辑这块加强,将错误之后抛异常的动作实现成自动添加http或https至url的开头处等都可。



def get_url(self, url):
if self.driver != None:
sleep(1)
if ‘http’ in url:
self.driver.get(url)
else:
session.add(err_message)
session.commit()
else:
session.add(fail_message)
session.commit()


  如果你的UI测试中不需要将用例的结果进行数据持久化,可以替换两个判断分支中的业务操作,打印到后台还是写入文件根据自己的测试流程要求来自定义即可。这里的数据库操作使用了sqlalchemy模块,我们定义db创建一个ORM基类,拿博主的脚本举例,我的ORM模型名(表名)为TestCaseResult,将各个测试场景(URL格式检查与浏览器对象检查)下的错误场景报错信息写入。我们的基本信息如下,执行后插入一条数据,包含错误代码,结果具体信息与一个复合用例的标识判断。`err_message = TestCaseResult(status='100200', result="URL格式有误", is_composite='False')`可以看出错误信息的内容还是比较简单的。我们只需在执行过后检查对应的自动化平台结果页面即可看到对应报错信息。  
   另外使用sqlalchemy操作数据库前记得创建对应的数据库对象。



engine = create_engine(“mysql://root:dEDsofe@19admv@172.20.30.241/rtz_fund_trade?charset=uft8”,
echo=True,
pool_size=8,
pool_recycle=60*30
)


这里在连接参数后有三个选项,分别为:  
 echo: 当设置为True时会将orm语句转化为sql语句打印,一般debug的时候可用  
 pool\_size: 连接池的大小,默认为5个,设置为0时表示连接无限制  
 pool\_recycle: 设置时间以限制数据库多久没连接自动断开


当然我们本着易维护的思想理念,还是将数据库接连的动作进行常量设定。



HOST = ‘172.20.30.241’
PORT = ‘3306’
DATABASE = ‘rtz_fund_trade’
UNAME = ‘root’
PASSWD = ‘dEDsofe@19admv’
DB_URL = ‘mysql+pymysql://{username}:{pwd}@{host}:{port}/{db}?charset=utf8’
.format(username=UNAME, pwd=PASSWD, host=HOST, port=PORT, db=DATABASE)
engine = create_engine(DB_URL)


  接下去使用`engine = create_engine(DB_URI,echo=True)`进行数据库的连接,因为操作数据库必须创建会话来进行控制,所以我们还需要使用`session = sessionmaker(engine)()`创建一个会话。之后就如最初的代码中所进行的操作来进行数据库的数据写入。当然以上说的这些操作大家应该将其也封装为一个或者多个类。


 


#### 2.1.3 浏览器窗口操作


  窗口操作也是比较常用的基础功能之一,以下将基本的最大化、最小化、前进、后退、刷新、设定尺寸大小封装起来。之后会判断可变参数的长度,根据传入的长度不同进行对应的窗口操作。



def browser_handle(self, *args):
param = len(args)
if param == 1:
if args[0] == ‘max’:
self.driver.maximize_window()
elif args[0] == ‘min’:
self.driver.minimize_window()
elif args[0] == ‘forward’:
self.driver.forward()
elif args[0] == ‘back’:
self.driver.back()
else:
self.driver.refresh()
elif param == 2:
self.driver.set_window_size(args[0], args[1])
else:
session.add(fail_message)
session.commit()
sleep(2)


 


#### 2.1.4 切换窗口


  另一个日常较为频繁的业务操作就是切换窗口,也就是我们的标签页,我们可以使用遍历的方式获得一个当前所有的窗口列表,通过传递默认参数title来进行当前窗口的切换,直到匹配到与title相同的窗口。



def switch_windows(self, title=None):
windows_list = self.driver.window_handles
current_window = self.driver.current_window_handle
for i in windows_list:
if i != current_window:
time.sleep(1)
self.driver.switch_to.window(i)
if self.assert_title(title):
break


 


#### 2.1.5 获取页面元素


  元素定位自然不必多说了,web自动化中的基础操作,也是日常接触的最多的功能,封装的功能只需传两个参数,定位方式与元素对应的属性值。这里可以改造的地方还是有很多的,比如不手动指定,通过持久化或者文件指定对应要查找的元素,需要定位的元素属性也可以通过其他方式进行抽出,总之二开的话大家可以根据业务需求进行灵活多变的定制。另外elements的定位就不演示了,大家举一反三即可。



def get_element(self, by, ele):
element = None
try:
if by == ‘id’:
element = self.driver.find_element(By.ID, ele)
elif by == ‘name’:
element = self.driver.find_element(By.NAME, ele)
elif by == ‘css’:
element = self.driver.find_element(By.CSS_SELECTOR, ele)
elif by == ‘class’:
element = self.driver.find_element(By.CLASS_NAME, ele)
else:
element = self.driver.find_element(By.XPATH, ele)
except:
session.add(ele_err_msg)
session.commit()
return element


 


#### 2.1.6 层级元素定位


  层级元素定位的实现逻辑其实就是根据链式写法产生的,原生的find\_element()方法是可以从当前捕捉到的元素层级开始往下再次定位的,我们就利用这一特性,先使用上一个定位元素的方法get\_element()来再一次进行find\_element()方法,这样就可以实现层级元素的定位操作。这里有一点需要注意的是,虽然原理如此,但切不可偷懒,调用两次get\_element(),因为这个方法本身含有driver对象,两次调用会使程序无法识别具体使用的是哪个对象,从而导致报错。



def get_level_element(self, by, ele, ch_by, ch_ele):
element = self.get_element(by, ele)
ch_element = None
try:
if ch_by == ‘id’:
ch_element = element.find_element(By.ID, ch_ele)
elif ch_by == ‘name’:
ch_element = element.find_element(By.NAME, ch_ele)
elif ch_by == ‘css’:
ch_element = element.find_element(By.CSS_SELECTOR, ch_ele)
elif ch_by == ‘class’:
ch_element = element.find_element(By.CLASS_NAME, ch_ele)
else:
ch_element = element.find_element(By.XPATH, ch_ele)
except:
session.add(ele_err_msg)
session.commit()
return ch_element


 


#### 2.1.7 信息输入操作


  输入操作的封装也是相对比较直白的,定位元素并传值即可。需要注意的点就是如果定位的元素本身出了问题的话,我们可以利用判断条件来规避一些异常的情况。



def send_info(self, by, ele, info):
element = self.get_element(by, ele)
if element is not None:
element.send_keys(info)
else:
session.add(null_key_msg)
session.commit()


 


#### 2.1.8 点击操作


  逻辑同信息输入操作,大家自行体会。



![img](https://img-blog.csdnimg.cn/img_convert/5e2c1ce83cee205f223346f48bef9c8b.png)
![img](https://img-blog.csdnimg.cn/img_convert/d754186e530a04c7b1f733d2549b086d.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

05)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值