python自动化测试工具selenium使用指南

发表于:2022-6-28 09:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:悠悠i    来源:博客园

  概述
  selenium是网页应用中最流行的自动化测试工具,可以用来做自动化测试或者浏览器爬虫等。官网地址为:https://www.selenium.dev/。相对于另外一款web自动化测试工具QTP来说有如下优点:
  ·免费开源轻量级,不同语言只需要一个体积很小的依赖包
  · 支持多种系统,包括Windows,Mac,Linux
  · 支持多种浏览器,包括Chrome,FireFox,IE,safari,opera等
  · 支持多语言,包括Java,C,python,c#等主流语言
  · 支持分布式测试用例执行
  python+selenium环境安装
  首先需要安装python(推荐3.7+)环境,然后直接用pip install selenium安装依赖包即可。
  另外还需要下载浏览器相应的webdriver驱动程序,注意下载的驱动版本一定要匹配浏览器版本。
  · Firefox浏览器驱动:geckodriver
  · Chrome浏览器驱动:chromedriver
  · IE浏览器驱动:IEDriverServer
  · Edge浏览器驱动:MicrosoftWebDriver
  · Opera浏览器驱动:operadriver
  下载以后可以把驱动程序加到环境变量,这样使用时就不用手动指定驱动程序路径。
  使用selenium启动浏览器
  可以在python中使用下面的代码启动一个Chrome浏览器,然后控制这个浏览器的行为或者读取数据。
  from selenium import webdriver
  # 启动Chrome浏览器,要求chromedriver驱动程序已经配置到环境变量
  # 将驱动程序和当前脚本放在同一个文件夹也可以
  driver = webdriver.Chrome()
  # 手动指定驱动程序路径
  driver = webdriver.Chrome(r'D:/uusama/tools/chromedriver.exe')
  driver = webdriver.Ie()        # Internet Explorer浏览器
  driver = webdriver.Edge()      # Edge浏览器
  driver = webdriver.Opera()     # Opera浏览器
  driver = webdriver.PhantomJS()   # PhantomJS
  driver.get('http://uusama.com')  # 打开指定路径的页面
  启动的时候还可以设置启动参数,比如下面的代码实现启动时添加代理,并且忽略https证书校验。
  from selenium import webdriver
  # 创建chrome启动选项对象
  options = webdriver.ChromeOptions()
  options.add_argument("--proxy-server=127.0.0.1:16666")  # 设置代理
  options.add_argument("---ignore-certificate-errors")  # 设置忽略https证书校验
  options.add_experimental_option("excludeSwitches", ["enable-logging"])  # 启用日志
  # 设置浏览器下载文件时保存的默认路径
  prefs = {"download.default_directory": get_download_dir()}
  options.add_experimental_option("prefs", prefs)
  driver = webdriver.Chrome(options=options)
  一些非常有用的启动选项,下面使用的options = webdriver.ChromeOptions():
  options.add_argument("--proxy-server=127.0.0.1:16666"): 设置代理,可以结合mitmproxy进行抓包等。
  option.add_experimental_option('excludeSwitches', ['enable-automation']): 设置绕过selenium检测。
  options.add_argument("---ignore-certificate-errors"): 设置忽略https证书校验。
  options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}): 设置不请求图片模式加快页面加载速度。
  chrome_options.add_argument('--headless'): 设置无头浏览器。
  selenium页面加载等待和检测
  使用selenium打开页面以后,还不能立刻操作,需要等到待处理页面元素加载完成,这时就需要检测和等待页面元素加载。
  使用time.sleep()等待
  最简单的方法就是打开页面以后,使用time.sleep()强制等待一定时间,该方法只能设置一个固定时间等待,如果页面提前加载完成,则会空等阻塞。
  from time import sleep
  from selenium import webdriver
  driver = webdriver.Chrome()
  driver.get('http://uusama.con')
  time.sleep(10)
  print('load finish')
  使用implicitly_wait设置最长等待时间
  另外还可以使用implicitly_wait设置最长等待时间,如果在给定时间内页面加载完成或者已经超时,才会执行下一步。该方法会等到所有资源全部加载完成,也就是浏览器标签栏的loading图表不再转才会执行下一步。有可能页面元素已经加载完成,但是js或者图片等资源还未加载完成,此时还需要等待。
  另需注意使用implicitly_wait只需设置一次,且对整个driver生命周期都起作用,凡是遇到页面正在加载都会阻塞。
  示例如下:
  from selenium import webdriver
  driver = webdriver.Chrome()
  driver.implicitly_wait(30)   # 设置最长等30秒
  driver.get('http://uusama.com')
  print(driver.current_url)
  driver.get('http://baidu.com')
  print(driver.current_url)
  使用WebDriverWait设置等待条件
  使用WebDriverWait(selenium.webdriver.support.wait.WebDriverWait)能够更加精确灵活地设置等待时间,WebDriverWait可在设定时间内每隔一段时间检测是否满足某个条件,如果满足条件则进行下一步操作,如果超过设置时间还不满足,则抛出TimeoutException异常,其方法声明如下:
  WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
  其中各参数含义如下:
  ·driver:浏览器驱动
  · timeout:最长超时时间,默认以秒为单位
  · poll_frequency:检测的间隔(步长)时间,默认为0.5秒
  · ignored_exceptions:忽略的异常,即使在调用until()或until_not()的过程中抛出给定异常也不中断
  WebDriverWait()一般配合until()或until_not()方法使用,表示等待阻塞直到返回值为True或者False,需要注意这两个方法的参数都需是可调用对象,即方法名称,可以使用expected_conditions模块中的方法或者自己封装的方法。
  from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.ui import WebDriverWait
  from selenium.webdriver.support import expected_conditions
  driver = webdriver.Chrome()
  driver.get("http://baidu.com")
  # 判断id为`input`的元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就返回WebElement
  element = WebDriverWait(driver, 5, 0.5).until(expected_conditions.presence_of_element_located((By.ID, "s_btn_wr")))
  # implicitly_wait和WebDriverWait都设置时,取二者中最大的等待时间
  driver.implicitly_wait(5)
  # 判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0
  WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID, 'su')))
  # 判断元素是否可见,如果可见就返回这个元素
  WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID, value='kw')))
  下面列出expected_conditions常用的一些方法:
  title_is: 判断当前页面title是否精确等于预期。
  title_contains: 判断当前页面title是否包含预期字符串。
  presence_of_element_located: 判断某个元素是否被加到了dom树里,并不代表该元素一定可见。
  visibility_of_element_located: 判断某个元素是否可见。(元素非隐藏,并且元素的宽和高都不等于0)
  visibility_of: 跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了。
  presence_of_all_elements_located: 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True。
  text_to_be_present_in_element: 判断某个元素中的text是否包含了预期的字符串。
  text_to_be_present_in_element_value: 判断某个元素中的value属性是否包含了预期的字符串。
  frame_to_be_available_and_switch_to_it: 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False。
  invisibility_of_element_located: 判断某个元素中是否不存在于dom树或不可见。
  element_to_be_clickable: 判断某个元素中是否可见并且是enable的,这样的话才叫clickable。
  staleness_of: 等某个元素从dom树中移除,注意,这个方法也是返回True或False。
  element_to_be_selected: 判断某个元素是否被选中了,一般用在下拉列表。
  element_selection_state_to_be: 判断某个元素的选中状态是否符合预期。
  element_located_selection_state_to_be: 跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator。
  检测document是否加载完成
  另外还可以使用driver.execute_script('return document.readyState;') == 'complete'来检测document是否加载完成。
  注意document加载完成,是不包括那种异步加载ajax请求动态渲染dom的,这种需要使用WebDriverWait检测某个元素是否渲染完成。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号