51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1195|回复: 0
打印 上一主题 下一主题

让 Selenium 稳定运行的技巧

[复制链接]
  • TA的每日心情
    郁闷
    2022-8-29 14:43
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2018-2-24 16:33:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    Selenium简介

    Selenium是非常流行的Web自动化测试工具。它具有自动化测试用例制作简单,支持多种浏览器和
    不同的操作系统等优点。

    Selenium脚本不稳定的问题

    有很多时候Selenium的自动化测试脚本运行并不是很稳定。经常会遇到系统明明正常运行,但是测
    试却失败的情况。例如,点击上传图片按钮并上传图片,如果在上传加载完成之前就操作下一步,
    会提示错误信息。

    出现问题的原因可能是服务器的响应速度慢,在页面内容没有加载完毕的状态下Selenium就执行了
    下一条命令,从而导致测试失败。上面的上传图片场景,虽然在上传图片后可以加入固定的等待几
    秒钟的代码,但是因为上传图片的速度并不是固定的时间,当服务器的负载较高的时候,上传图片
    的速度变慢,所以造成了测试的失败。

    脚本运行不稳定的解决方法

    固定等待时间
    上面的问题的解决方法之一就是使用python程序语言的sleep函数,来暂停固定秒数的时间,通过延
    迟执行下一条命令,多少能有所改善。但是这个方法为了解决偶尔发生的问题,不得不在测试(用例)
    脚本中插入很多sleep语句,会造成测试时间的变长,因此并不推荐。

    下面是通过python语言来实现固定等待时间的相关代码:
    1. import time

    2. time.sleep(2) #默认等待2秒
    复制代码
    设置隐性等待时间
    可以通过下面代码来设置selenium内置的智能等待时间,但是在上传图片等待的情况下智能等待没有
    生效。
    1. from selenium import webdriver   #导入浏览器驱动

    2. browser = webdriver.Chrome("/home/kyle/bin/chromedriver")
    3. browser.implicitly_wait(10)  #设置智能等待10秒
    复制代码
    使用selenium提供的WebDriverWait方法
    通过下面代码可以使用selenium提供的等待页面元素加载的方法:
    1. from selenium.webdriver.support.wait import WebDriverWait

    2. # 使用selenium提供的WebDriverWait方法,每0.5秒检查一次定位的元素,超时设置是2秒
    3. WebDriverWait(browser, 2).until(
    4.         lambda driver: driver.find_element_by_tag_name('body'))
    复制代码
    更好的解决方法
    通过利用python的异常捕获机制和循环语句,使程序在一定时间内即使selenium执行命令失败,也会继续
    重复执行同一条命令多次,直到成功为止。
    下面是相关的python程序代码:
    1. import time
    2. from selenium import webdriver   #导入浏览器驱动

    3. def smart_wait(self, element_id):  # 智能等待时间,60秒超时
    4.     for i in range(60):            # 循环60次,从0至59
    5.         if i >= 59 :               # 当i大于等于59时,打印提示时间超时
    6.             print("timeout")   
    7.             break
    8.         try:                       # try代码块中出现找不到特定元素的异常会执行except中的代码
    9.             if browser.find_element_by_id(element_id): # 如果能查找到特定的元素id就提前退出循环
    10.                 break
    11.         except:                    # 上面try代码块中出现异常,except中的代码会执行打印提示会继续尝试查找特定的元素id
    12.             print("wait for find element")
    13.         time.sleep(1)
    复制代码
    实例说明

    在实际测试工作中,有上传图片的场景,上传图片的时间和服务器的响应时间以及客户端网络状况有关
    系,所以有时候速度慢,有时候速度快。这种情况不适合使用固定等待时间的解决方法。可以通过上面
    提到的第二种方案来处理,先通过下面代码开始上传图片。
    1. browser.find_element_by_id(button_id).find_element_by_name("file").send_keys(file_path)
    2. # 注意:上面语句中find_element_by_id(button_id)中button_id为上传图片按钮的元素id
    复制代码
    然后调用上面提到的smart_wait(check_id)函数,传入参数要查找的元素id,这个参数的id是下面截图中
    红框标记处的id。找到这个元素id证明上传图片已经成功,可以开始下一步操作,如果找不到这个元素id
    说明上传图片还没有完成,还需要继续等待上传完成。

    如果selenium能找到这个元素id证明上传已经完成,会提前退出循环,继续执行下一步代码语句。如果找
    不到这个元素id就等待1秒之后继续查找,在默认的60次循环内直到找到为止。如果直到最后一次循环都
    没有找到想要的元素就打印提示信息:“timeout”。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-18 00:26 , Processed in 0.063092 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表