TW开源的selenium之初接触

原创
2021/01/24 22:29
阅读数 192

 一、简介

Selenium 是 thoughtworks公司的一个集成测试的强大工具 , 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样 .完全仿真式模拟用户在浏览器进行操作。 支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器, 支持多种OS如Windows、Linux、IOS、Android等

二、版本

Selenium 现在存在2个版本,一个叫 selenium-core, 一个叫selenium-rc 。

selenium-core 是使用HTML的方式来编写测试脚本,你也可以使用 Selenium-IDE来录制脚本,但是目前Selenium-IDE只有 FireFox 版本。

Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。

Selenium-RC 是 selenium-remote control 缩写,是使用具体的语言来编写测试类。支持的语言也比较多: Java,C#,Perl,Python和PHP

这样就可以编写更加复杂的测试用例,这里就重点讨论 Selenium-RC。

发展历史

  • 1.0   时代

selenium IDE:浏览器安装相应的插件,通过录制用户操作,生产测试脚本(类似于按键精灵)

selenium Grid: 利用RC进行集群并发,大规模的测试

selenium RC : 模拟单浏览器操作,支持多语言

存在的缺陷:

不支持本机键盘和鼠标事件

不支持XSS和HTTPS

不支持弹窗    、对话框、证书

  • 2.0时代

等于1.0+WebDriver

基于WebDriver API 来模拟用户操作

  • 3.0时代

支持Java8

支持多系统,包括MAC OS 和 safari浏览器,支持Edge浏览器,支持IE9

弃用 Selenium-RC

三、 Selenium3.0

1.工作原理

Selenium WebDriver的工作方式是这样

Test Script-------------》ChromeDriver---》Chrome Browser------->Web Server

2.实战

OS :   win7 64bit     IDE :PyCharm  Python:3.7  chrome driver

chrome driver 下载地址

1.谷歌官方镜像
http://chromedriver.storage.googleapis.com/index.html
2.淘宝镜像
https://npm.taobao.org/mirrors/chromedriver/

好在驱动文件不大,可以直接下载

创建py文件,开始编码。需要指定chromedriver的物理路径,以及windows下反斜杠的转义

from selenium import  webdriver
# 实例化一个web driver对象,其中 r 为转义反斜杠
driver1=webdriver.Chrome(r'G:\py\chromedriver.exe')
driver1.get('https://www.baidu.com/')
# 类似按键精灵,也需要等待时间,单位为秒
driver1.implicitly_wait(3)
# 返回 element 对象 ,输入数据
ele_input=driver1.find_element_by_id('kw')
ele_input.send_keys("张小娴")
# 点击按钮
ele_sub=driver1.find_element_by_id('su').click()
driver1.implicitly_wait(3)
#对返回的查询数据进行遍历,用到CSS表达式
ok=driver1.find_element_by_css_selector('a.s-tab-item.s-tab-pic')
ok.click()
#id elemet[class=on] 父级元素内,元素的 class
# ele_pic=driver1.find_elements_by_class_name('s-tab-item s-tab-pic')
# driver1.find_element_by_class_name()
# for el in ele_pic:
#     el.click()

总结起来就是:获取元素,操作元素以及鼠标键盘事件。

其中:获取元素的几种方式

#1. id定位:find_element_by_id("id值");id属性是唯一的
driver.find_element_by_id("loginName").clear()
driver.find_element_by_id("loginName").send_keys("admin")
driver.find_element_by_id("pwdTip").send_keys(Keys.TAB)#密码输入框的id属性
driver.find_element_by_id("pwdTip").send_keys("111111")
#2. name定位:元素的名称,find_element_by_name("name值");name属性值在当前页面可以不唯一
 driver.find_elements_by_name("PeriodName")[1].click()#选择学段:初中
 driver.find_elements_by_name("SubjectName")[0].click()#选择学科:语文
#3.class定位:元素的类名,find_element_by_class_name("class值")
driver.find_elements_by_class_name("u-btn-levred")[0].click()
#4. tag定位:页面html文档下的各种标签,基本没有用
find_element_by_tag_name("input")
#5. link定位:专门用来定位文本链接,find_element_by_link_name("text");
driver.find_element_by_link_text(u"退出").click()
#页面右上方的一些个人操作,比如退出、个人中心、消息通知等
#6. partial link定位:是对link定位的一种补充,当链接上的文本内容比较长的时候,可以取文本的一部分进行定位,当然#这部分可以唯一地标识这个链接

7. XPath定位:find_element_by_xpath("");有多种定位策略,用FirePath插件自动生成的涵盖以下几种方式

  1)绝对路径定位:对于没有id,name、classname不好定位的,这也是我最常用的,因为可以通过Firefox的FirePath插件可以方便的获取到xpath值

  2)利用元素属性定位:

  find_element_by_xpath(".//*[@id='Title']"),这里是用的id,也可以用元素其他能够唯一标识的属性,不局限于id、name、class这些;*代表的是标签名,不指定时就可以用*代替

  3)层级与属性结合:下图中就是这种

  4)使用逻辑运算符

 driver.find_element_by_xpath(".//*[@id='divword']/input[7]").click()#登录
 driver.find_element_by_xpath("html/body/div[4]/div/div[2]/div/div[3]/a[1]").click()#个人页面的发布课程操作

8. CSS定位(薄弱,用的很少,但很强大,比xpath简洁灵活):使用选择器来为页面元素绑定属性,可以灵活地选择控件的任意属性;find_element_by_css_selector("");同样也可以用FirePATH生成css哟

1)通过class属性定位:点号(".")表示通过class属性定位

#<input class="u-btn mart5" type="submit" onclick="return User.check()" value="登录"> driver.find_element_by_css_selector(".u-btn.mart5").click()

2)通过id属性定位:("#")表示通过id定位元素

driver.find_element_by_css_selector("#loginName")

  3)通过其他属性定位:("[]"),中括号里的属性可以唯一标识这个元素就可以;属性的值可以加引号,也可以不加

<input class="u-btn mart5" type="submit" onclick="return User.check()" value="登录">
 driver.find_element_by_css_selector("#div input[type=submit]").click()

9. 用By定位元素

  除find_element_by_***这种方式,还有另一套写法,也就是统一调用find_element()方法,两个参数,第一个参数是定位的类型,由By提供;第二个参数是定位的具体值

from selenium.webdriver.common.by import By     #使用By这种定位前要将By类导入

find_element(By.ID,"loginName")
find_element(By.NAME,"SubjectName")
find_element(By.CLASS_NAME,"u-btn-levred")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,"退出")
find_element(By.PARTIAL_LINK_TEXT,"退")
find_element(By.XPATH,".//*[@id='Title")
find_element(By.CSS_SELECTOR,"[type=submit]")

一半的工作在找元素,一般的工作在写业务逻辑

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部