软件测试:selenium自动化测试

 🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

selenium简介

selenium是一个用于web应用程序自动化测试工具,可以直接运行在浏览器,就行用户真正的在浏览器操作一样,支持的浏览器包括:IE,Firefox,Chrome,Safari

一、安装selenium

打开终端

pip install selenium

二、selenium 浏览器驱动

下载浏览器驱动

当selenium升级到3.0之后,对不同的浏览器驱动进行了规范。如果想使用selenium驱动不同的浏览器,必须单独下载并设置不同的浏览器驱动。

各浏览器下载地址:

Firefox浏览器驱动:geckodriver

Chrome浏览器驱动:chromedriver

IE浏览器驱动:IEDriverServer

设置浏览器驱动

设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。

我的电脑-->属性-->系统设置-->高级-->环境变量-->系统变量-->Path,将“C:\driver”目录添加到Path的值中。

    Path
    ;C:\driver

设置浏览器驱动

验证不同的浏览器驱动是否正常使用。

 
  1. from selenium import webdriver

  2. driver = webdriver.Firefox() # Firefox浏览器

  3. driver = webdriver.Chrome() # Chrome浏览器

  4. driver = webdriver.Ie() # Internet Explorer浏览器

三、selenium元素定位

Selenium提供了8种定位方式。

  • id

  • name

  • class name

  • tag name

  • link text

  • partial link text

  • xpath

  • css selector

这8种定位方式在Python selenium中所对应的方法为:

  • find_element_by_id()

  • find_element_by_name()

  • find_element_by_class_name()

  • find_element_by_tag_name()

  • find_element_by_link_text()

  • find_element_by_partial_link_text()

  • find_element_by_xpath()

  • find_element_by_css_selector()

定位方法的用法

假如我们有一个Web页面,通过前端工具(如,Firebug)查看到一个元素的属性是这样的。

 
  1. <html>

  2. <head>

  3. <body link="#0000cc">

  4. <a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})">

  5. <form id="form" class="fm" name="f" action="/s">

  6. <span class="soutu-btn"></span>

  7. <input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">

我们的目的是要定位input标签的输入框。

通过id定位:

dr.find_element_by_id("kw")

通过name定位:

dr.find_element_by_name("wd")

通过class name定位:

dr.find_element_by_class_name("s_ipt")

通过tag name定位:

dr.find_element_by_tag_name("input")

通过xpath定位,xpath定位有N种写法,这里列几个常用写法:

 
  1. dr.find_element_by_xpath("//*[@id='kw']")

  2. dr.find_element_by_xpath("//*[@name='wd']")

  3. dr.find_element_by_xpath("//input[@class='s_ipt']")

  4. dr.find_element_by_xpath("/html/body/form/span/input")

  5. dr.find_element_by_xpath("//span[@class='soutu-btn']/input")

  6. dr.find_element_by_xpath("//form[@id='form']/span/input")

  7. dr.find_element_by_xpath("//input[@id='kw' and @name='wd']")

 通过css定位,css定位有N种写法,这里列几个常用写法:

 
  1. dr.find_element_by_css_selector("#kw")

  2. dr.find_element_by_css_selector("[name=wd]")

  3. dr.find_element_by_css_selector(".s_ipt")

  4. dr.find_element_by_css_selector("html > body > form > span > input")

  5. dr.find_element_by_css_selector("span.soutu-btn> input#kw")

  6. dr.find_element_by_css_selector("form#form > span > input")

接下来,我们的页面上有一组文本链接。 

 
  1. <a class="mnav" href="http://news.baidu.com" name="tj_trnews">新闻</a>

  2. <a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>

通过link text定位:

 
  1. dr.find_element_by_link_text("新闻")

  2. dr.find_element_by_link_text("hao123")

通过link text定位:

 
  1. dr.find_element_by_partial_link_text("新")

  2. dr.find_element_by_partial_link_text("hao")

  3. dr.find_element_by_partial_link_text("123")

四、控制浏览器操作

控制浏览器窗口大小


有时候我们希望能以某种浏览器尺寸打开,让访问的页面在这种尺寸下运行。例如可以将浏览器设置成移动端大小(480* 800),然后访问移动站点,对其样式进行评估;WebDriver提供了set_window_size()方法来设置浏览器的大小。

 
  1. from selenium import webdriver

  2. driver = webdriver.Firefox()

  3. driver.get("http://m.baidu.com")

  4. # 参数数字为像素点

  5. print("设置浏览器宽480、高800显示")

  6. driver.set_window_size(480, 800)

  7. driver.quit()

在PC端执行自动化测试脚本大多的情况下是希望浏览器在全屏幕模式下执行,那么可以使用maximize_window()方法使打开的浏览器全屏显示,其用法与set_window_size() 相同,但它不需要参数。

控制浏览器后退、前进


在使用浏览器浏览网页时,浏览器提供了后退和前进按钮,可以方便地在浏览过的网页之间切换,WebDriver也提供了对应的back()和forward()方法来模拟后退和前进按钮。下面通过例子来演示这两个方法的使用。

 
  1. from selenium import webdriver

  2. driver = webdriver.Firefox()

  3. #访问百度首页

  4. first_url= 'http://www.baidu.com'

  5. print("now access %s" %(first_url))

  6. driver.get(first_url)

  7. #访问新闻页面

  8. second_url='http://news.baidu.com'

  9. print("now access %s" %(second_url))

  10. driver.get(second_url)

  11. #返回(后退)到百度首页

  12. print("back to %s "%(first_url))

  13. driver.back()

  14. #前进到新闻页

  15. print("forward to %s"%(second_url))

  16. driver.forward()

  17. driver.quit()

为了看清脚本的执行过程,下面每操作一步都通过print()来打印当前的URL地址。


刷新页面

driver.refresh() #刷新当前页面

五、WebDriver常用方法

点击和输入

前面我们已经学习了定位元素, 定位只是第一步, 定位之后需要对这个元素进行操作, 或单击(按钮) 或输入(输入框) , 下面就来认识 WebDriver 中最常用的几个方法:

    clear(): 清除文本。

    send_keys (value): 模拟按键输入。

    click(): 单击元素。

 
  1. from selenium import webdriver

  2. driver = webdriver.Chrome()

  3. driver.get("https://www.baidu.com")

  4. driver.find_element_by_id("kw").clear()

  5. driver.find_element_by_id("kw").send_keys("selenium")

  6. driver.find_element_by_id("su").click()

  7. driver.quit()

提交


  • submit()

submit()方法用于提交表单。 例如, 在搜索框输入关键字之后的“回车” 操作, 就可以通过该方法模拟。

 
  1. from selenium import webdriver

  2. driver = webdriver.Chrome()

  3. driver.get("https://www.baidu.com")

  4. search_text = driver.find_element_by_id('kw')

  5. search_text.send_keys('selenium')

  6. search_text.submit()

  7. driver.quit()

其他常用方法


  • size: 返回元素的尺寸。

  • text: 获取元素的文本。

  • get_attribute(name): 获得属性值。

  • is_displayed(): 设置该元素是否用户可见。

 
  1. from selenium import webdriver

  2. driver = webdriver.Chrome()

  3. driver.get("http://www.baidu.com")

  4. # 获得输入框的尺寸

  5. size = driver.find_element_by_id('kw').size

  6. print(size)

  7. # 返回百度页面底部备案信息

  8. text = driver.find_element_by_id("cp").text

  9. print(text)

  10. # 返回元素的属性值, 可以是 id、 name、 type 或其他任意属性

  11. attribute = driver.find_element_by_id("kw").get_attribute('type')

  12. print(attribute)

  13. # 返回元素的结果是否可见, 返回结果为 True 或 False

  14. result = driver.find_element_by_id("kw").is_displayed()

  15. print(result)

  16. driver.quit()

输出结果:

 
  1. {'width': 500, 'height': 22}

  2. ©2015 Baidu 使用百度前必读 意见反馈 京 ICP 证 030173 号

  3. text

  4. True

执行上面的程序并查看结果: size 方法用于获取百度输入框的宽、 高, text 方法用于获得百度底部的备案信息, get_attribute()用于获得百度输入的 type 属性的值, is_displayed()用于返回一个元素是否可见, 如果可见则返回 True, 否则返回 False。


六、鼠标事件

在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。

ActionChains 类提供了鼠标操作的常用方法:

perform(): 执行所有 ActionChains 中存储的行为;

context_click(): 右击;

double_click(): 双击;

drag_and_drop(): 拖动;

move_to_element(): 鼠标悬停。

鼠标悬停操作

 
  1. from selenium import webdriver

  2. # 引入 ActionChains 类

  3. from selenium.webdriver.common.action_chains import ActionChains

  4. driver = webdriver.Chrome()

  5. driver.get("https://www.baidu.cn")

  6. # 定位到要悬停的元素

  7. above = driver.find_element_by_link_text("设置")

  8. # 对定位到的元素执行鼠标悬停操作

  9. ActionChains(driver).move_to_element(above).perform()

七、键盘事件

Keys()类提供了键盘上几乎所有按键的方法。 前面了解到, send_keys()方法可以用来模拟键盘输入, 除此 之外, 我们还可以用它来输入键盘上的按键, 甚至是组合键, 如 Ctrl+A、 Ctrl+C 等。

 
  1. from selenium import webdriver

  2. # 引入 Keys 模块

  3. from selenium.webdriver.common.keys import Keys

  4. driver = webdriver.Chrome()

  5. driver.get("http://www.baidu.com")

  6. # 输入框输入内容

  7. driver.find_element_by_id("kw").send_keys("seleniumm")

  8. # 删除多输入的一个 m

  9. driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)

  10. # 输入空格键+“教程”

  11. driver.find_element_by_id("kw").send_keys(Keys.SPACE)

  12. driver.find_element_by_id("kw").send_keys("教程")

  13. # ctrl+a 全选输入框内容

  14. driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')

  15. # ctrl+x 剪切输入框内容

  16. driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')

  17. # ctrl+v 粘贴内容到输入框

  18. driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')

  19. # 通过回车键来代替单击操作

  20. driver.find_element_by_id("su").send_keys(Keys.ENTER)

  21. driver.quit()

以下为常用的键盘操作:
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

send_keys(Keys.SPACE) 空格键(Space)

send_keys(Keys.TAB) 制表键(Tab)

send_keys(Keys.ESCAPE) 回退键(Esc)

send_keys(Keys.ENTER) 回车键(Enter)

send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)

send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)

send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)

send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)

send_keys(Keys.F1) 键盘 F1


八、获取断言信息

不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。

我们通常可以通过获取title 、URL和text等信息进行断言。text方法在前面已经讲过,它用于获取标签对之间的文本信息。 下面同样以百度为例,介绍如何获取这些信息。

 
  1. from selenium import webdriver

  2. from time import sleep

  3. driver = webdriver.Firefox()

  4. driver.get("https://www.baidu.com")

  5. print('Before search================')

  6. # 打印当前页面title

  7. title = driver.title

  8. print(title)

  9. # 打印当前页面URL

  10. now_url = driver.current_url

  11. print(now_url)

  12. driver.find_element_by_id("kw").send_keys("selenium")

  13. driver.find_element_by_id("su").click()

  14. sleep(1)

  15. print('After search================')

  16. # 再次打印当前页面title

  17. title = driver.title

  18. print(title)

  19. # 打印当前页面URL

  20. now_url = driver.current_url

  21. print(now_url)

  22. # 获取结果数目

  23. user = driver.find_element_by_class_name('nums').text

  24. print(user)

  25. driver.quit()

脚本运行结果如下:

 
  1. Before search================

  2. 百度一下,你就知道

  3. https://www.baidu.com/

  4. After search================

  5. selenium_百度搜索

  6. https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx...

  7. 搜索工具

  8. 百度为您找到相关结果约5,380,000个

title:用于获得当前页面的标题。

current_url:用户获得当前页面的URL。

text:获取搜索条目的文本信息。

九、设置元素等待

WebDriver提供了两种类型的等待:显式等待和隐式等待。

显式等待

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。


 
  1. from selenium import webdriver

  2. from selenium.webdriver.common.by import By

  3. from selenium.webdriver.support.ui import WebDriverWait

  4. from selenium.webdriver.support import expected_conditions as EC

  5. driver = webdriver.Firefox()

  6. driver.get("http://www.baidu.com")

  7. element = WebDriverWait(driver, 5, 0.5).until(

  8. EC.presence_of_element_located((By.ID, "kw"))

  9. )

  10. element.send_keys('selenium')

  11. driver.quit()

WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
  • driver :浏览器驱动。

  • timeout :最长超时时间,默认以秒为单位。

  • poll_frequency :检测的间隔(步长)时间,默认为0.5S。

  • ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。

WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。

  • until(method, message=‘’)

调用该方法提供的驱动程序作为一个参数,直到返回值为True。

  • until_not(method, message=‘’)

调用该方法提供的驱动程序作为一个参数,直到返回值为False。

在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

隐式等待


WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0。它的用法相对来说要简单得多。

 
  1. from selenium import webdriver

  2. from selenium.common.exceptions import NoSuchElementException

  3. from time import ctime

  4. driver = webdriver.Firefox()

  5. # 设置隐式等待为10秒

  6. driver.implicitly_wait(10)

  7. driver.get("http://www.baidu.com")

  8. try:

  9. print(ctime())

  10. driver.find_element_by_id("kw22").send_keys('selenium')

  11. except NoSuchElementException as e:

  12. print(e)

  13. finally:

  14. print(ctime())

  15. driver.quit()

implicitly_wait() 默认参数的单位为秒,本例中设置等待时长为10秒。首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。


十、关闭浏览器

在前面的例子中我们一直使用quit()方法,其含义为退出相关的驱动程序和关闭所有窗口。除此之外,WebDriver还提供了close()方法,用来关闭当前窗口。例多窗口的处理,在用例执行的过程中打开了多个窗口,我们想要关闭其中的某个窗口,这时就要用到close()方法进行关闭了。

    close() 关闭单个窗口

    quit() 关闭所有窗口

十一、Selenium使用ChromeOptions启动参数

ChromeOptions是chromedriver支持的浏览器启动选项。

 
  1. from selenium import webdriver

  2. options = webdriver.ChromeOptions()

options常用属性及方法为:

  • binary_location='':指定Chrome浏览器路径
  • debuger_address=':指定调试路径
  • headless: 无界面模式
  • add_argument():添加启动参数
  • add_extension:添加本地插件
  • add_experimental_option:添加实验选项
  • to_capablilities:将options转为标准的capablitiies格式

通过add_argument()可以添加启动参数,如初始化窗口尺寸,隐身模式等。

 
  1. options.add_argument('headless') # 无界面启动,也可以直接设置options.headless=True

  2. driver = webdriver.Chrome(options=options) # 相当于 driver = webdriver.Chrome(desired_capabilities=options.to_capablities())

生效的ChromeOptions参数

 
  1. # 无界面模式

  2. options.add_argument('headless')

  3. # 指定用户客户端-模拟手机浏览

  4. options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')

  5. # 禁用图片加载

  6. options.add_argument('blink-settings=imagesEnabled=false')

  7. # 隐身模式

  8. options.add_argument('incognito')

  9. # 自动打开开发者工具

  10. options.add_argument("auto-open-devtools-for-tabs")

  11. # 设置窗口尺寸,注意宽高之间使用逗号而不是x

  12. options.add_argument('window-size=300,600')

  13. # 设置窗口启动位置(左上角坐标)

  14. options.add_argument('window-position=120,0')

  15. # 禁用gpu渲染

  16. options.add_argument('disable-gpu')

  17. # 全屏启动

  18. options.add_argument('start-fullscreen')

  19. # 全屏启动,无地址栏

  20. options.add_argument('kiosk')

  21. # 启动时,不激活(前置)窗口

  22. options.add_argument('no-startup-window')

  23. ...

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值