用Pageobject的方式使用Webdriver

Posted 51Testing软件测试网

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Pageobject的方式使用Webdriver相关的知识,希望对你有一定的参考价值。


  一、代码引用结构

用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模块主要包括以下几个文件

用Pageobject的方式使用Webdriver

  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模块用以管理待操作对象

用Pageobject的方式使用Webdriver

  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

 
推荐阅读

点击阅读☞

点击阅读☞

点击阅读☞

点击阅读☞

点击阅读☞


点击左下角“阅读原文”查看更多内容!

以上是关于用Pageobject的方式使用Webdriver的主要内容,如果未能解决你的问题,请参考以下文章

Selenium:使用PageFactory实现PagaObject设计模式

PageObject设计模式进行自动化用例的设计方法

PageObject模式的层次结构

TestNG+WebDriver 测试的内存 + CPU 分析

Selenium+PageObject+Java实现测试用例

selenium自动化测试框架之PO设计模式