1 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定位:

  1. dr.find_element_by_id("kw")

·         通过name定位:

  1. dr.find_element_by_name("wd")

·         通过class name定位:

  1. dr.find_element_by_class_name("s_ipt")

·         通过tag name定位:

  1. 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("")

2 控制浏览器操作

控制浏览器窗口大小

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

  1. from selenium import webdriver
  2.  
  3. driver = webdriver.Firefox()
  4. driver.get("http://m.baidu.com")
  5.  
  6. # 参数数字为像素点
  7. print("设置浏览器宽480、高800显示")
  8. driver.set_window_size(480, 800)
  9. driver.quit()

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

控制浏览器后退、前进

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

  1. from selenium import webdriver
  2.  
  3. driver = webdriver.Firefox()
  4.  
  5. #访问百度首页
  6. first_url= 'http://www.baidu.com'
  7. print("now access %s" %(first_url))
  8. driver.get(first_url)
  9.  
  10. #访问新闻页面
  11. second_url='http://news.baidu.com'
  12. print("now access %s" %(second_url))
  13. driver.get(second_url)
  14.  
  15. #返回(后退)到百度首页
  16. print("back to %s "%(first_url))
  17. driver.back()
  18.  
  19. #前进到新闻页
  20. print("forward to %s"%(second_url))
  21. driver.forward()
  22.  
  23. driver.quit()

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

刷新页面

有时候需要手动刷新(F5) 页面。

  1. ……
  2. driver.refresh() #刷新当前页面
  3. ……

3 WebDriver常用方法

点击和输入

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

·         clear(): 清除文本。

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

·         click(): 单击元素。

  1. from selenium import webdriver
  2.  
  3. driver = webdriver.Chrome()
  4. driver.get("https://www.baidu.com")
  5.  
  6. driver.find_element_by_id("kw").clear()
  7. driver.find_element_by_id("kw").send_keys("selenium")
  8. driver.find_element_by_id("su").click()
  9.  
  10. driver.quit()

提交

·         submit()

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

  1. from selenium import webdriver
  2.  
  3. driver = webdriver.Chrome()
  4. driver.get("https://www.baidu.com")
  5.  
  6. search_text = driver.find_element_by_id('kw')
  7. search_text.send_keys('selenium')
  8. search_text.submit()
  9.  
  10. driver.quit()

有时候 submit()可以与 click()方法互换来使用, submit()同样可以提交一个按钮, 但 submit()的应用范围远不及 click()广泛。

其他常用方法

·         size: 返回元素的尺寸。

·         text: 获取元素的文本。

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

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

  1. from selenium import webdriver
  2.  
  3. driver = webdriver.Chrome()
  4. driver.get("http://www.baidu.com")
  5.  
  6. # 获得输入框的尺寸
  7. size = driver.find_element_by_id('kw').size
  8. print(size)
  9.  
  10. # 返回百度页面底部备案信息
  11. text = driver.find_element_by_id("cp").text
  12. print(text)
  13.  
  14. # 返回元素的属性值, 可以是 id、 name、 type 或其他任意属性
  15. attribute = driver.find_element_by_id("kw").get_attribute('type')
  16. print(attribute)
  17.  
  18. # 返回元素的结果是否可见, 返回结果为 True 或 False
  19. result = driver.find_element_by_id("kw").is_displayed()
  20. print(result)
  21.  
  22. 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。

4 鼠标事件

在 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.  
  5. driver = webdriver.Chrome()
  6. driver.get("https://www.baidu.cn")
  7.  
  8. # 定位到要悬停的元素
  9. above = driver.find_element_by_link_text("设置")
  10. # 对定位到的元素执行鼠标悬停操作
  11. ActionChains(driver).move_to_element(above).perform()
  12.  
  13. ……

·         from selenium.webdriver import ActionChains

导入提供鼠标操作的 ActionChains 类。

·         ActionChains(driver)

调用 ActionChains()类, 将浏览器驱动 driver 作为参数传入。

·         move_to_element(above)

context_click()方法用于模拟鼠标右键操作, 在调用时需要指定元素定位。

·         perform()

执行所有 ActionChains 中存储的行为, 可以理解成是对整个操作的提交动作。

5 键盘事件

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

  1. from selenium import webdriver
  2. # 引入 Keys 模块
  3. from selenium.webdriver.common.keys import Keys
  4.  
  5. driver = webdriver.Chrome()
  6. driver.get("http://www.baidu.com")
  7.  
  8. # 输入框输入内容
  9. driver.find_element_by_id("kw").send_keys("seleniumm")
  10.  
  11. # 删除多输入的一个 m
  12. driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
  13.  
  14. # 输入空格键+“教程”
  15. driver.find_element_by_id("kw").send_keys(Keys.SPACE)
  16. driver.find_element_by_id("kw").send_keys("教程")
  17.  
  18. # ctrl+a 全选输入框内容
  19. driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
  20.  
  21. # ctrl+x 剪切输入框内容
  22. driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
  23.  
  24. # ctrl+v 粘贴内容到输入框
  25. driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')
  26.  
  27. # 通过回车键来代替单击操作
  28. driver.find_element_by_id("su").send_keys(Keys.ENTER)
  29. driver.quit()

需要说明的是, 上面的脚本没有什么实际意义, 仅向我们展示模拟键盘各种按键与组合键的用法。

·         from selenium.webdriver.common.keys import Keys

在使用键盘按键方法前需要先导入 keys 类。

以下为常用的键盘操作:

·         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

·         ……

·         send_keys(Keys.F12) 键盘 F12

6 获取断言信息

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

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

  1. from selenium import webdriver
  2. from time import sleep
  3.  
  4. driver = webdriver.Firefox()
  5. driver.get("https://www.baidu.com")
  6.  
  7. print('Before search================')
  8.  
  9. # 打印当前页面title
  10. title = driver.title
  11. print(title)
  12.  
  13. # 打印当前页面URL
  14. now_url = driver.current_url
  15. print(now_url)
  16.  
  17. driver.find_element_by_id("kw").send_keys("selenium")
  18. driver.find_element_by_id("su").click()
  19. sleep(1)
  20.  
  21. print('After search================')
  22.  
  23. # 再次打印当前页面title
  24. title = driver.title
  25. print(title)
  26.  
  27. # 打印当前页面URL
  28. now_url = driver.current_url
  29. print(now_url)
  30.  
  31. # 获取结果数目
  32. user = driver.find_element_by_class_name('nums').text
  33. print(user)
  34.  
  35. 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:获取搜索条目的文本信息。

7 设置元素等待

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.  
  6. driver = webdriver.Firefox()
  7. driver.get("http://www.baidu.com")
  8.  
  9. element = WebDriverWait(driver, 5, 0.5).until(
  10. EC.presence_of_element_located((By.ID, "kw"))
  11. )
  12. element.send_keys('selenium')
  13. 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.  
  5. driver = webdriver.Firefox()
  6.  
  7. # 设置隐式等待为10秒
  8. driver.implicitly_wait(10)
  9. driver.get("http://www.baidu.com")
  10.  
  11. try:
  12. print(ctime())
  13. driver.find_element_by_id("kw22").send_keys('selenium')
  14. except NoSuchElementException as e:
  15. print(e)
  16. finally:
  17. print(ctime())
  18. driver.quit()

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

8 定位一组元素

WebDriver还提供了8种用于定位一组元素的方法。

find_elements_by_id()
find_elements_by_name()
find_elements_by_class_name()
find_elements_by_tag_name()
find_elements_by_link_text()
find_elements_by_partial_link_text()
find_elements_by_xpath()
find_elements_by_css_selector()

定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数。

接下来通过例子演示定位一组元素的使用:

  1. from selenium import webdriver
  2. from time import sleep
  3.  
  4. driver = webdriver.Chrome()
  5. driver.get("https://www.baidu.com")
  6.  
  7. driver.find_element_by_id("kw").send_keys("selenium")
  8. driver.find_element_by_id("su").click()
  9. sleep(1)
  10.  
  11. # 定位一组元素
  12. texts = driver.find_elements_by_xpath('//div/h3/a')
  13.  
  14. # 循环遍历出每一条搜索结果的标题
  15. for t in texts:
  16. print(t.text)
  17.  
  18. driver.quit()

程序运行结果:

  1. Selenium - Web Browser Automation
  2. 官网
  3. 功能自动化测试工具——Selenium
  4. selenium + python自动化测试环境搭建 - 虫师 - 博客园
  5. selenium是什么?_百度知道
  6. 怎样开始用selenium进行自动化测试(个人总结)_百度经验
  7. Selenium_百度百科
  8. selenium_百度翻译
  9. Selenium官网教程_selenium自动化测试实践_Selenium_领测软件测试网
  10. Selenium(浏览器自动化测试框架)_百度百科
  11. 自动化基础普及之selenium是啥? - 虫师 - 博客园
  12. python十大主流开源框架 「菜鸟必看」

基于python的selenium常用操作方法(1)的更多相关文章

  1. 基于python的selenium常用操作方法(2)

    9 多表单切换 在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位.这 ...

  2. 基于python的Selenium使用小结

    之前介绍过基于Unittest和TestNG自动化测试框架,然而基于Web端的测试的基础框架是需要Selenium做主要支撑的,这里边给大家介绍下Web测试核心之基于Python的Selenium 一 ...

  3. 基于python的selenium自动化测试环境搭建

    Windows下的环境搭建: 1.安装python2.7.152.cmd里敲pip install selenium3.安装firefox47.geckodriver11(并将geckodriver. ...

  4. python列表的常用操作方法

    主要介绍了Python中列表(List)的详解操作方法,包含创建.访问.更新.删除.其它操作等,需要的朋友可以参考下. 1.创建列表.只要把逗号分隔的不同的数据项使用方括号括起来即可 List = [ ...

  5. selenium常用操作方法

    Webdriver中比较常用的操作元素的方法: clear() 清除输入框的默认内容 send_keys("xxx") 在一个输入框里输入xx内容 ——如果输入中文,则需要在脚本开 ...

  6. 《Selenium自动化测试实战:基于Python》Selenium自动化测试框架入门

    第1章  Selenium自动化测试框架入门 1.1  Selenium自动化测试框架概述 说到目前流行的自动化测试工具,相信只要做过软件测试相关工作,就一定听说过Selenium. 图1-1是某企业 ...

  7. 基于python的selenium自动化测试环境安装

    1. Python2安装 官方网站:https://www.python.org/downloads/ (python3或新版本已经默认集成了pip包和path,安装的时候打勾就行,可以直接跳过下面第 ...

  8. python字典的常用操作方法

    Python字典是另一种可变容器模型(无序),且可存储任意类型对象,如字符串.数字.元组等其他容器模型.本文章主要介绍Python中字典(Dict)的详解操作方法,包含创建.访问.删除.其它操作等,需 ...

  9. 基于python的selenium两种文件上传操作

    方法一.input标签上传     如果是input标签,可以直接输入路径,那么可以直接调用send_keys输入路径,这里不做过多赘述,前文有相关操作方法. 方法二.非input标签上传 这种上传方 ...

随机推荐

  1. postgres centos 创建数据库 创建用户

    一个小的流程关于如何创建数据库和用户,用以加强印象,以及留档备份 一.创建账户 1.登录postgres账户 su postgres 2.进入psql 指令 psql 3.创建用户 create US ...

  2. liunxCPU和内存,磁盘等资源

    1.Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换.GNU Screen可以看作是窗口管理器的命令行界面版本. ...

  3. day96_11_28 mongoDB与scrapy框架

    一.mongodb mongodb是一个面向文档的数据库,而不是关系型数据库.不采用关系型是为了获得更好的扩展性. 它与mysql的区别在于它没有表连接,但是可以通过其他办法实现. 安装数据库. 上官 ...

  4. CentOS 7怎么删除mariadb

    参考链接:https://www.cnblogs.com/ytkah/p/10876824.html

  5. Yii2 中常用的增删改查操作总结

    一.新增 1.使用save() $model = new User(); $model->name = 'test'; $model->phone = '13000000000'; $mo ...

  6. 激活函数-Activation Function

    该博客的内容是莫烦大神的授课内容.在此只做学习记录作用. 原文连接:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow ...

  7. Ant Design Pro 改变默认启动端口号

    找到package.json文件,找到图位置加--port即可.

  8. AttributeError: 'unicode' object has no attribute 'tzinfo' 未解决

    Internal Server Error: /demo/machineinfo.htmlTraceback (most recent call last): File "C:\Python ...

  9. 选择企业架构实践公开课的指导?TOGAF+ArchiMate+BangEA,EA工作者必学一门公开课

    我发现身边越来越多人谈数字化.谈企业架构,但是感觉谈的总是IT?知道好像不对,但是又好像也无法告诉别人这和传统的IT架构有什么不一样?网上找资料,看了很多也摸不到门路,也不知道别人讲的对不对.对了还好 ...

  10. 微信退款异步通知报错Illegal key size or default parameters 的解决办法

    问题原因: Java几乎各种常用加密算法都能找到对应的实现.因为美国的出口限制,Sun通过权限文件(local_policy.jar.US_export_policy.jar)做了相应限制.因此存在一 ...