安装

插件:firebug、firepath 注意:安装firepath需要先安装firebug

一、安装selenium

  1. 在线安装:命令行(cmd)窗口输入pip install selenium就会默认安装最新版本的seleium
  2. 离线安装:
    a、到官网上https://pypi.org/project/selenium/下载selenium……tar.gz
    b、解压缩到某个磁盘路径下
    c、启动cmd命令行窗口,使用cd进入该解压缩后的磁盘路径,执行python setup.py install

二、安装浏览器及驱动

windows:

  • 火狐浏览器 https://github.com/mozilla/geckodriver/releases
    下载geckodriver.exe驱动文件至python安装路径下
    查找python安装路径 cmd下输入命令 where python
    测试环境:
    cmd>python>from selenium import webdriver
    如果没有报错说明安装成功
  • chrome浏览器
    http://chromedriver.storage.googleapis.com/index.html
    下载对应版本的chromedriver.exe至python安装路径下 接下来的步骤同火狐这里不再赘述
    linux

1、下载对应版本的chromedriver、geckodriver
2、把chromedriver.exe拷贝到python安装目录的Scripts目录下(添加到系统环境变量)

查看python安装路径: where python

3、验证
cmd命令行: chromedriver

下载地址

chromedriver : 下载对应版本
http://chromedriver.storage.googleapis.com/index.html

geckodriver
https://github.com/mozilla/geckodriver/releases

1、下载后解压tar -zxvf geckodriver.tar.gz
2、拷贝解压后文件到 /usr/bin/ (添加环境变量)sudo cp geckodriver /usr/bin/
3、更改权限sudo -icd /usr/bin/chmod 777 geckodriver

二、元素定位

  • id定位
    使用目标页面元素的id属性值来定位,这是最建议使用的定位方法,因为id属性是页面元素的唯一标识,所以定位最准确。
driver.find_element_by_id("username")from selenium.webdrive.common.by import By
driver.find_element(By.ID,"password")
  • xpath定位
driver.find_element_by_xpath(".//*[@id='mainNav']/a[10]")from selenium.webdrive.common.by import By
driver.find_element(By.XPATH,".//*[@id='mainNav']/a[10]")
a、绝对路径xpath表达式:从根节点(html)开始按照路径级别书写,例如:html/body/form/textarea
b、相对路径xpath表达式:从中间层某节点开始书写,例如://form/textarea
更建议使用相对路径xpath表达式,因为更容易维护。xpath表达式既可以定位一个页面元素,也可以定位一组页面元素。
  • name定位
    使用name属性值来定位,也是比较建议使用的定位方法,没有id定位准确,因为可能存在多个页面元素,name属性值相同。
driver.find_element_by_name("imageField")from selenium.webdriver.common.by import By
driver.find_element(By.NAME,"imageField")
  • link_text定位
    使用链接的文本来定位,只适用于链接,不适用于其他类型的页面元素。
    链接的文本就是与之间的文本内容。
driver.find_element_by_link_text("退出")from selenium.webdriver.common.by import By
driver.find_element(By.LINK_TEXT,"退出")
  • partial_link_text定位
    使用链接的一部分文本来定位,一般适用于长链接。
driver.find_element_by_partial_link_text("总计金额")from selenium.webdriver.common.by import By driver.find_element(By.PARTIAL_LINK_TEXT,"原装电池")
  • class_name定位
    使用页面元素的class属性值来定位,不建议直接使用,因为可能存在多个页面元素class属性值相同,定位可能会不准确。

  • tag_name定位
    使用页面元素的标记名称来定位,也是不建议直接使用,因为可能存在标记名称相同的多个页面元素,也会定位不准确

三、常见的控件操作

  • 文本框或文本域
    (1)输入数据:send_keys是追加输入,有一个参数,就是要输入的那个字符串。
    (2)清空:clear,无参。

  • 按钮
    (1)点击:click,无参。
    (2)获得按钮上的文本内容:get_attribute,有一个参数,一般是value,代表获得value属性的当前值(就是按钮上的当前文本内容)。
    (3)获得按钮是否可用的状态数据:is_enabled,无参,返回值是bool数据,True代表可用,False代表不可用(置灰)。

  • 单选按钮和复选框
    (1)点击:click,无参,点击后可以选中。
    (2)获得是否被选中的状态:is_selected,无参,返回值是bool类型,True代表被选中的状态,False代表未被选中的状态。
    (3)获得文本值:get_attribute,有一个参数,一般是value,代表获得其value属性值(就是文本值)。

补充:定位页面元素时,可以使用find_element来定位一个页面元素(第一个),也可以使用find_elements来定位一组页面元素(以list形式返回)。

  • 纯文本或超级链接
    文本出现在开始和结束标记之间,都可以使用text属性来获得。
    注意:text属性名称后不加小括号!!!

  • 图片:点击click

四、模拟键盘特殊按键操作

1、先导入Keys类
from selenium.webdriver.common.keys import Keys
2、send_keys后参数位置就可以使用这些键盘上的特殊按键来操作。
说明:如果是组合键,使用逗号分隔。
示例:

from selenium.webdriver.common.keys import

五、下拉列表操作

下拉列表四步操作:导入、定位、封装、操作。
第一步:导入Select类
第二步:定位下拉列表,与普通页面元素定位无区别
第三步:封装为Select类型的对象。
第四步:操作它。

from selenium.webdriver.support.select import Select
cat=driver.find_element_by_id("category")
cat_select=Select(cat)1)选择第3个选项
cat_select.select_by_index(2)
2)通过value属性值选择选项
示例:选择value属性值等于”12“的选项(也就是”充值卡“)
cat_select.select_by_value("12")3)通过选项的文本选择选项
说明:选项的文本就是<option></option>之间的文本。
示例:选择文本内容是“充值卡”的选项
cat_select.select_by_visible_text("充值卡")4)通过选项编号取消选择选项
示例:取消选择“汉族”(1个选项)
ns.deselect_by_index(0)5)通过value属性值来取消选择选项
示例:取消选择“回族”
ns.deselect_by_value("回族")6)通过选项的文本来取消选择选项
示例:取消选择“满族”
ns.deselect_by_visible_text("满族")7)所有选项全部取消
示例:ns.deselect_all()8)获得是否允许多选的状态值,True代表允许多选,False代表不允许多选。默认没有multiple属性时,None也代表默认不允许多选。
示例:print(ns.is_multiple)9)获得所有备选项,不管当前是选中的,还是未选中的,全部都活的到,options返回一个list。
示例:获得所有的备选项(不一定被选中)
for city in cs.options:print(city.text)10)获得所有已选择的选项,all_selected_options返回一个list。
示例:print("所有已选择的选项是:")
for option in ns.all_selected_options:print(option.text)11)获得唯一一个被选择的选项,输出其文本
示例:print(cs.first_selected_option.text)

六、弹出信息框操作

1.Alert对象:网页上层弹出的信息框。
2.切换到弹出框,获得Alert对象。
示例:
a1=driver.switch_to.alert
3.获得弹出框中的文本信息,使用text属性就可以获得。
示例:
print(a1.text)#请输入姓名!
4.点击“确定”关闭弹出框,包括所有肯定答案按钮(确定、是),调用accept实现。
示例:a1.accept()
5.点击“取消”关闭弹出框,包括所有否定答案按钮(取消、否),调用dismiss实现。
示例:a1.dismiss()
6.如果是输入型弹出框,可以调用send_keys实现输入数据的要求。
示例:a1.send_keys(“123456”)
7.说明:webdriver在处理弹出框中的换行符时没有缺陷,所以换行符需要写\n

七、操作浏览器

1.获得当前网页标题,title属性,后面不加小括号。

driver.title

2.获得当前网页地址(URL),current_url属性,后面不加小括号。

driver.current_url

3.浏览器后退,back函数,无参。

driver.back()

4.浏览器前进,forward函数,无参

driver.forward()

5.浏览器刷新,refresh函数,无参

driver.refresh()

6.设置浏览器窗口大小,set_window_size,需要宽度和高度两个参数,都是像素值。

driver.set_window_size(1000,500)

先查看屏幕分辨率,设置为与分辨率相同的宽度和高度,接近于最大化的效果。

driver.set_window_size(1024,768)

7.切换到新浏览器窗口

(1)先获得当前浏览器窗口句柄
h1=driver.current_window_handle
(2)获得当前所有自动启动的浏览器窗口句柄,返回list
all=driver.window_handles
(3)遍历,判断不是当前窗口,就是目标窗口
for h in all:if h!=h1:driver.switch_to.window(h)

8.关闭浏览器窗口:
quit:无参,关闭所有由WebDriver自动启动的浏览器窗口。
close:无参,关闭当前所操作的这一个浏览器窗口,保留其他浏览器窗口。

等待操作

(1)线程休眠:time的sleep函数来实现等待固定时间,初学者使用较多,语法简单,但是效率和稳定性无法保证。
(2)隐式等待:全局的等待时间,设置了每个页面元素定位的超时等待时间(最多等待多久)。

第一步:导入异常类
from selenium.common.exceptions import NoSuchElementException
第二步:设置隐式等待的超时时间为10秒
driver.implicitly_wait(10)
第三步:尝试定位元素来操作
try:un_input=driver.find_element_by_id("username")un_input.send_keys("lisi")pw_input=driver.find_element_by_id("password")pw_input.send_keys("123456")cm_input=driver.find_element_by_id("comments")cm_input.send_keys("hello")s_button=driver.find_element_by_id("submit")s_button.click()如果抛出异常,那么处理这些异常
except NoSuchElementException as e:print(e)
最终关闭浏览器
finally:driver.quit()

(3)显式等待:等待固定条件成立后继续运行代码,可以根据业务需要,等待更具体的一些条件,例如:标题等于xxx,网址包含xxx,元素出现,弹出框出现,按钮变为可用……。

第一步:导入相关类和模块
rom selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
第二步:实例化WebDriverWait对象,1个参数driver对象,第2个参数是等待的超时时间(单位是秒)第3个参数是检测条件是否成立的间隔时间(单位也是秒),默认是0.5,可省略
w1=WebDriverWait(driver,10,0.5)
第三步:等待指定条件成立
un_locator=(By.NAME,"username")
ec1=EC.presence_of_element_located(un_locator)
un_input=w1.until(ec1)

切换Frame

1.Frame或IFrame标记是用于在主网页中嵌套显示子网页的技术,在WebDriver的自动化测试中,目标页面元素如果属于某个Frame子网页内的元素,那么就必须先切换进入该Frame,才能定位到。

2.切换Frame的实现方式

1)方式一:通过frame或iframe标记的id或name属性值来切换。---最常用!!!
示例:
切换到id或name属性值是f2的Frame里
driver.switch_to.frame("f2")2)方式二:通过索引号(编号)来切换。
查看当前要切换进入的frame或iframe是当前网页中的第几个frame,按照从0开始的编号来切换。
示例:
切换到第2个Frame
driver.switch_to.frame(1)3)方式三:通过其他方式(例如xpath、className等)先定位到frame或iframe标记的页面元素,再把该元素对象作为切换Frame的参数数据。
示例:
通过xpath定位到目标frame,然后再切换进入该frame
frame2=driver.find_element_by_xpath("//frame[contains(@src,'frame2')]")
driver.switch_to.frame(frame2)
4.注意:如果已经切换进入某个frame,接下来想要切换进入其他frame之前,需要先切换回上一级页面,或切换回默认主页面。
(1)切换回上一级页面
driver.switch_to.parent_frame()2)切换回默认主页面
driver.switch_to.default_content()

unittest

1.新建unittest的测试类的步骤:
(1)导入unittest模块
(2)新建Python file时,选择Kind为Python unit test,可以自动生成一些代码,这里的类一定要继承自unittest模块中的TestCase类。
(3)覆盖setUp函数,实现一些初始化的操作步骤,例如连接数据库、读取外部文件、启动浏览器等。
(4)编写test开头的函数(称为测试函数),实现具体的测试步骤,这样的函数可以有1到多个。
(5)在测试函数中使用unittest所提供的断言方法,实现数据的检查。
(6)覆盖tearDown函数,实现一些收尾步骤,例如关闭数据库连接、释放资源、关闭浏览器等。
(7)在程序执行入口调用unittest提供的main函数。
2.unittest的测试套件,可以实现测试用例的批量运行
(1)准备测试用例中的测试函数
(2)新建测试套件对象
suite=unittest.TestSuite()
(3)向测试套件中添加测试用例
示例:suite.addTest(TestCount(“test_add1”))
(4)新建测试运行器对象
runner=unittest.TextTestRunner()
(5)调用运行器的runner实现测试套件的批量运行
示例:runner.run(suite)

总体示例:
if __name__ == "__main__":suite=unittest.TestSuite()suite.addTest(TestCount("test_add1"))suite.addTest(TestCount("test_add2"))suite.addTest(Tc8001("test_tc8001"))runner=unittest.TextTestRunner()runner.run(suite)

3…通过默认加载器来加载指定路径下的某规则模块名称的所有模块来批量运行。

import unittest
ts_dir='./'
ts1=unittest.defaultTestLoader.discover(ts_dir,pattern='tc*.py')if __name__=="__main__":runner=unittest.TextTestRunner()runner.run(ts1)

4.unittest提供的断言方法:

5.测试类优化
1)新建MyTest类,继承自unittest.TestCase类,实现setUp和tearDown或其他一些通用函数。
示例:
import unittest
from selenium import webdriver

class MyTest(unittest.TestCase):

def setUp(self):self.driver=webdriver.Firefox()self.driver.implicitly_wait(20)
def tearDown(self):self.driver.quit()

(2)新建Python file,选择Python unit test类型,新建测试类后,修改父类为MyTest类,这样就可以不用在测试类中书写通用函数,只书写测试函数test_xxx即可。

测试框架设计

1.PageObject设计模式:
(1)设计思想:将每个网页都封装为一个对象,将该网页内的操作动作都封装为函数,也可以将所有的定位都封装到另一个描述定位方法的类中,而测试类只需要关于业务,不必关注网页实现细节。
(2)案例:02-seleniumday08(for student)/demo01.html
2.详细设计:
(1)定位:day0802包里demo01_v1_locator.py
(2)操作模块:day0802包里demo01_v1_register.py
(3)测试业务:day0802包里demo01_v1_testing.py
3.从csv读取测试数据
(1)导入csv
import csv
(2)读取csv数据
示例:
# 读取csv文件中的数据
f=open(‘D:/mydata1.csv’,‘r’)
d=csv.reader(f)
for row in d:
self.mc.type_name(row[0])

基础——selenium相关推荐

  1. UI自动化基础 - selenium快速入门教学

    前言 自上次更新了xpath路径的查找,这几天又完成了一些关于selenium里方法的学习,感觉selenium确实不失为一个好的自动化入门软件.所以秉着不断学习的过程,也顺带记录一下selenium ...

  2. firefox应用自动全屏显示_【b】—自动化测试:基础selenium—API

    一.浏览器对象 # 导入webdriverfrom selenium import webdriver# 创建一个浏览器对象driver = webdriver.Firefox()# 设置全屏# dr ...

  3. 【交通领域张同学】-基础selenium企查查企业信用码抓取

    目录 1. 需要用到的库 2. 本地打开浏览器,需要手动登录.(selenium库) 3. 从excel文件中读取数据(xlrd库) 4. 模拟爬虫(利用模拟手动操作浏览器来实现) 1. Xpath的 ...

  4. Selenium基础 — Selenium操作浏览器窗口滚动条

    1.为什么操作滚动条 在HTML页面中,由于前端技术框架的原因,页面中的一些元素为动态显示,元素根据滚动条的下拉而被加载. 例如:页面注册同意条款,需要滚动条到最底层,才能点击同意. 2.Seleni ...

  5. 测试工具基础------Selenium常用定位方法

    如果想要做自动化测试的话,还是要不断的学习,对于Selenium确实是非常强大,可以使用代码来控制浏览器,做一些类似功能测试的功能 常用的事件有 button.click() #点击 driver.g ...

  6. Selenium基础 — Selenium中的expected_conditions模块(一)

    1.expected_conditions模块介绍 expected_conditions是Selenium的一个模块,主要用于对页面元素的加载进行判断,包括元素是否存在,可点击等等. Expecte ...

  7. 《Selenium自动化测试指南》—第1章1.1节自动化测试基础

    本节书摘来自异步社区<Selenium自动化测试指南>一书中的第1章1.1节自动化测试基础,作者赵卓,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.1 自动 ...

  8. Selenium自动化测试框架—简单了解

    Selenium自动化测试框架-简单了解 Selenium自动化测试框架 Selenium IDE Selenium API基础 Selenium API高级 案例 Selenium自动化测试框架 什 ...

  9. python网络爬虫——使用selenium抓取东方财富网上市公司公告

    每日公告数量@TOC 一.数据获取与预处理 本文从东方财富网上市公司公告页面获取沪深A股1991-2019年公告数据,按照数据获取的先后顺序,将数据分为以下两个部分一是上市公司公告信息,包括:序号(i ...

最新文章

  1. 【计算理论】计算复杂性 ( 无向图独立集问题 | 独立集问题是 NP 完全问题证明思路 | 证明独立集问题是 NP 完全问题 )
  2. linux mysql 端口配置文件_Linux配置测试环境,部署项目(指定端口,数据库连接)...
  3. java 对象转json,java首字母小写,判断方法是否为javabean方法
  4. 用tomcat 发布mule 服务 (转)
  5. bzoj5093: [Lydsy1711月赛]图的价值
  6. jrockit_Java堆空间– JRockit和IBM VM
  7. java接收前台tex格式t数据_java 下载文件时,设置response.setContentType 根据文件类型...
  8. 先导课程 单片机_单片机技术(北京航空航天大学)-壹课堂 - 公开课 | 精品课程 | 教学视频...
  9. LoRa VS NB-IoT,一场物联网时代 C 位争夺战
  10. 高斯滤波程序编写 opencv C++ CSU
  11. 电子签名服务和云平台整合管理合同
  12. 数字孪生港珠澳大桥:大湾区综合管理信息系统
  13. 4针串口线接法图_9针rs232串口接线图以及接线方法
  14. 扒一扒那些叫欧拉的定理们(一)——基本介绍和简单多面体欧拉定理
  15. MySQL之desc查看表结构的详细信息
  16. 1553B 调试记录
  17. 安徽师大附中%你赛day2T3 巧克力 解题报告
  18. 怎样申请微信公众号/如何开通微信订阅号
  19. 华为机考攻略(python)--字符串操作【9题】(第四题*HJ33整数与IP地址间的转换)
  20. osgEarth指北针

热门文章

  1. 创新工具|用同理心地图(Empathy Map)深度洞察用户
  2. Java实现剪切MP3格式的文件_总结java中文件拷贝剪切的5种方式-JAVA IO基础总结第五篇...
  3. android json教程,Android之JSON解析
  4. aardio 谷歌浏览器自动化 (四) 浏览器动作和信息获取
  5. VLAN虚拟局域网配置实验
  6. 华为防火墙(以USG6330为例)升级中心无法连接问题
  7. Unity3d 和 3dmax轴向问题以及快速解决方案
  8. Indie音乐的基本知识
  9. Spring 5-代理和AOP 笔记
  10. VS2015无法使用编辑并继续 及 警告LNK4075的解决方法