用Pageobject的方式使用Webdriver
Posted 51Testing软件测试网
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Pageobject的方式使用Webdriver相关的知识,希望对你有一定的参考价值。
一、代码引用结构
S001:主要调用webdriver中以下文件及类,这些类是webdriver运行的基本依赖。Public模块对此类依赖进行了再次封装。
import selenium.webdriver as webdriver
import selenium.webdriver.common.by as by
import selenium.webdriver.support.wait as Wait
import selenium.webdriver.support.expected_conditions as Expect
from selenium.webdriver.common.action_chains import ActionChains
S002:requests包主要供调用api或者执行web-api(浏览器中执行的请求)使用。extend模块实现了其再次封装以及实例的实现。
S003:自定义了日志输出的模式,在public模块中实现了相类的类。
S004:subprocess模拟调用ffmpeg.exe执行命令,实现录像的操作。在public模块中实现了相关的类。
二、具体模块的实现
S-p001:public模块主要包括以下几个文件
S-t001:common文件主要包括以下方法
def log(words, filename=time.strftime('%Y-%m-%d') + ".log", mode="a"):
写自定义日志文件
def to_request_cookies(webdriver_cookies):
将webdriver cookies转换成requests cookies
S-t002:mydriver文件主要包括以下方法等等。
其主要目的是增强查找对象的可靠性,以及在webdriver操作层对可重复使用的方法进行公共抽象。
def wait_find_element(self, tupleBy, time = 10, hlight=False):
尝试5次等待寻找对象,且每次对象的超时时间为10秒,如果hlight为true则高亮对象。找到对象则返回该对象。
def wait_find_elements(self, tupleBy, time = 10, hlight=False):
尝试5次等待寻找多个对象,且每次对象的超时时间为10秒,如果hlight为true则高亮对象。找到对象则返回该对象list。
def wait_subchild_element(self,father_element,tupleBy, times = 10, hlight=False):
多层对象的查找
def wait_get_style_display(self,typleBy):
获取对象的style中的display值
def wait_find_element_mousover(self,tupleBy):
将光标移动到对象中
下例展示了wait_find_element的实现
def wait_find_element(self, tupleBy, time = 10, hlight=False):
ok = False
i = 1
while (i <= 5):
try:
wait_element = Wait.WebDriverWait(self.maindr, time).until(lambda maindr: maindr.find_element(tupleBy[0], tupleBy[1]))
com.log("find element ok " + tupleBy[0] + " " + tupleBy[1])
if hlight:
self.high_light(wait_element)
return wait_element
except Exception as e:
if (i == 5):
com.log("find element fail " + tupleBy[0] + " " + tupleBy[1] + " " + str(e))
finally:
i = i + 1
S-t003:const即常用常量
如,HOST = "https://test.myfoscam.com"
S-t004:在subprocess中执行ffmepg命令
def start(self,filename):开始录像
self.save_filename = self.record_dir() + "\\"+filename+".avi"
self.delete_current_record()
cmd = "%s -draw_mouse 1 -offset_x 0 -offset_y 0 -f GDIgrab -i desktop %s" %(self.get_ffmpeg_path(),self.save_filename)
# print "cmd = %s" % cmd
self.process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,universal_newlines=True)
def stop(self):
停止录像
S-p002:pageobject模块用以管理待操作对象
S-t005:pageobject模块用以页面的方式来管理操作的对象。并且pageobject模块,调用S-t002中的wait_find_element方法用以驱动相关方法。其主要划分方法为,查找方式为类的属性、操作的过程为sub方法,检查的方式为check方法。其主要目的,是方便对象被修改后易于维护,且易用被其它地方调用的时候能够重用。
其具体实现如下例所示:
'''首页'''
class MainPage(mydriver.MyDriver):
myBy = by.By()
'''登录用户名'''
findByID_user_email = (myBy.ID, "user-email")
'''登录密码'''
findByID_user_password = (myBy.ID, "user-password")
'''登录按钮'''
findByID_login_button = (myBy.ID, "login-button")
'''登录错误提示语层'''
findByID_error_msg = "error-msg"
'''首页标题'''
check_main_title_string = "Foscam Cloud Service"
'''登录过程'''
def sub_login(self, user_email, user_password):
self.switch_default()
object_user_email = self.wait_find_element(self.findByID_user_email)
object_user_password = self.wait_find_element(self.findByID_user_password)
object_login_button = self.wait_find_element(self.findByID_login_button)
if object_login_button == None or object_user_email == None or object_user_password == None:
return None
else:
'''先清除输入框中的内容'''
object_user_email.clear()
object_user_password.clear()
'''输入内容'''
object_user_email.send_keys(user_email)
object_user_password.send_keys(user_password)
object_login_button.click()
'''如果出现等待中则继续等待,直到尝试了10次后停止
在登录时,期望False
'''
def wait_login(self,bool_expect = True):
bool_wait = True
wait_times = 3
i = 0
while ( i <= wait_times):
try:
self.switch_default()
if bool_expect == False:
expect_time = 2
else:
expect_time = 10
object_error_msg = self.wait_find_element(self.findByID_login_button,time=expect_time)
if object_error_msg == None:
bool_wait = False
else:
if bool_expect == False:
time.sleep(10)
pass
else:
return object_error_msg
except Exception as e:
if i == wait_times:
return bool_wait
finally:
i += 1
return bool_wait
"""
检查登录失败时的提示语内容是否与指定的指符串一致
"""
def check_login_faiure_string(self, faiure_string):
object_error_msg = self.wait_login()
if object_error_msg != False:
if faiure_string in object_error_msg.getText():
return True
.......
(本文出自《51测试天地》原创测试文章系列(四十三))
推荐阅读 点击阅读☞
点击阅读☞
点击阅读☞
点击阅读☞
点击阅读☞
点击左下角“阅读原文”查看更多内容!
以上是关于用Pageobject的方式使用Webdriver的主要内容,如果未能解决你的问题,请参考以下文章
Selenium:使用PageFactory实现PagaObject设计模式
TestNG+WebDriver 测试的内存 + CPU 分析