设为首页收藏本站
 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3088|回复: 4

[学乐-python+selenium自动化之三]--父类BasePage

5

主题

9

帖子

45

积分

版主

Rank: 7Rank: 7Rank: 7

积分
45

突出贡献

学乐 发表于 2015-7-21 18:31:07 | 显示全部楼层 |阅读模式
本帖最后由 学乐 于 2015-7-21 18:57 编辑

BasePage中封装了常用的webdriver API,这样的话,可以在测试用例中减少脚本中减少代码的重复,使用例更加健壮
  1. BasePage.py具体内容附件中查看,在此处写完后总是没办法保存
复制代码

我们就拿下面这两个方法解释一下吧
  1. def find_element(self, key):
  2.     # 定位一个元素:与工具原生API作用完全一致,只是增加了操作结果检查和日志记录。
  3.     data = self.get_value(key)
  4.     try:
  5.         element = WebDriverWait(self.driver, 10).until(lambda driver: driver.find_element(data[0], data[1]))
  6.         return element
  7.     except BaseException, e:
  8.         self.operation_check(key + u'元素未发现', False)
  9.         print e
复制代码

1、定义方法
3、通过get_value方法,获取yaml中的定位信息(具体解释在[学乐-python+selenium自动化之二]--定位信息中已解释
5、使用WebDriverWait()方法,进行显示等待,在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常,找到则返回定位信息。
8、当5抛出异常后,调用operation_check()方法,进行截图操作

  1. def click(self, key):
  2.     # 鼠标左键单击操作,
  3.     isSucceed = False
  4.     aaa = self.find_element(key)
  5.     try:
  6.         aaa.click()
  7.         isSucceed = True
  8.     except BaseException, e:
  9.         print e
  10.     self.operation_check(u'点击 <' + key + u'> 操作', isSucceed)
复制代码

1、定义鼠标左键单击的方法
4、调用find_element(key)方法,对需要点击的元素进行定位
6、进行单击操作
10、通过isSucceed记录单击操作是否成功,然后调用operation_check()方法,若成功,输入:点击<XXX>操作成功,若失败,输出:XXX 运行失败!请查看截图快照:截图保存地址。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
快乐的学习!!!
回复

使用道具 举报

4

主题

19

帖子

399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
399
webdriver 发表于 2015-7-22 09:04:58 | 显示全部楼层
挺好的,不过对你的等待时间有点疑问,WebDriverWait(self.driver, 10).until(lambda driver: driver.find_element(data[0], data[1])), 这里的10秒钟是写死了么,如果好多时候等待元素需要操作10秒这里是不是不太好操作了呢?我觉得是不是该抽离出来做成可配置的呢。

5

主题

9

帖子

45

积分

版主

Rank: 7Rank: 7Rank: 7

积分
45

突出贡献

学乐  楼主| 发表于 2015-7-22 09:37:47 | 显示全部楼层
本帖最后由 学乐 于 2015-7-22 09:46 编辑
webdriver 发表于 2015-7-22 09:04
挺好的,不过对你的等待时间有点疑问,WebDriverWait(self.driver, 10).until(lambda driver: driver.find_ ...

在10秒之内默认每隔0.5秒去查找一次,如果10秒之内找不到就返回异常,找到了就马上进行下面的操作,10秒是可以设置的。

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
driver - WebDriver 的驱动程序(Ie, Firefox,Chrome 等)
timeout - 最长超时时间,默认以秒为单位
poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
这样的好处就是,找到了就马上进行下面的操作,找不到最多等十秒就抛出异常,第一:不会把时间浪费在等待时间上,第二:好多人说有时候能成功有时候不能成功,基本都是因为网络反应慢造成的,这样做可以把这个问题完美的解决了。我使用这个方法和以前在脚本中加time.sleep(2)相比,整个脚本的时间可以提高一倍,脚本的健壮性也增强了。
快乐的学习!!!

4

主题

19

帖子

399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
399
webdriver 发表于 2015-7-22 20:35:06 | 显示全部楼层
学乐 发表于 2015-7-22 09:37
在10秒之内默认每隔0.5秒去查找一次,如果10秒之内找不到就返回异常,找到了就马上进行下面的操作,10秒是 ...

我明白这个意思,我的意思是在框架中应该独立出来,做成变量配置. 因为你目前的是写在封装的方法里的,而如果需要修改这个值的话,我就需要去修改方法了,对吧?
回复 支持 反对

使用道具 举报

5

主题

9

帖子

45

积分

版主

Rank: 7Rank: 7Rank: 7

积分
45

突出贡献

学乐  楼主| 发表于 2015-7-23 14:22:39 | 显示全部楼层
webdriver 发表于 2015-7-22 20:35
我明白这个意思,我的意思是在框架中应该独立出来,做成变量配置. 因为你目前的是写在封装的方法里的,而 ...

恩,可以这样做,不过在我这个父类中没必要这么做,整个框架中,这个方法就用到一次,其他的都是来调用它,如果把它再单独写到一个方法里面,再去调用,就麻烦了。
快乐的学习!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则