找回密码
 立即注册
杭州6期1—何茹 +好友
这个人很懒什么都没写
听众
2
主题
19
金钱
236
个人名片
粉丝关注
还没有人关注TA
添加表情

python中selenium之基本介绍

已有 178 次阅读2021-5-6 20:12

一、selenium
selenium是一个第三方库,python有很多库。
1、什么是ui自动化?(ui:就是界面设计页面)通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。
2、ui自动化的优点
(1)解决重复性的功能测试和验证
(2)减少测试人员在回归测试时用例漏测和验证点的漏测
(3)减少冒烟测试,回归测试的人力成本,节省时间,提高测试效率
3、ui自动化缺点?
(1)需求不稳定,比如,敏捷开发速度快,ui频繁变革,定位不稳定,提高了用例维护的成功
(2)自动化用例的覆盖率,占用例总数的20%-30%(正常场景)
(3)场景覆盖占当前功能场景70%-80%
4、ui自动化和功能测试那个更重要?都重要,先功能测试成功以后,再ui自动化测试原因:(1)功能测试是基础,在熟悉功能的前提下才能做好ui自动化

二、介绍selenium
Selenium介绍 
Selenium是一个应用于web应用程序的测试工具,支持多平台,多浏览器,多语言
去实现ui自动化测试,我们现在讲的Selenium版本其实是Selenium2版本
Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包
括IE,Firefox,Safari,Google Chrome等。
selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium
IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium
Grid)


使用selenium的优点
1、工具免费
2、安装简单,小巧,selenium其实就是一个包
3、支持多语言(java,python)+selenium完成自动化测试
4、支持多平台(window,linux)
5、支持多浏览器 (ie,firefox,chrome)


三、selenium工作原理
Selenium2的核心是webdriver
webdriver是按照 client-server设计原理设计
client:简单来说就是我们写的代码,以http请求的方式发送给server端,server
端接收请求,执行相应操作,并返回给client端。
server:客户端的脚本启动后,被控制的浏览器就是server端,职责就是等待
client端发送请求并作出响应。
使用的协议:
JSON Wire protocol(作用是可以让同一个浏览器驱动处理不同编程语言的脚本)


安装方法
1、selenium命令
pip3  install selenium (python3中pip.exe默认在python的Scripts路径下)

2、可使用以下命令查看是否安装成功
(1)dos命令:pip show selenium,本地文件selenium放在python37_lib_site-packages路径
(2)python   settings   project interpreter     +    selenium
搜索settings 输入下载的selenium,  sapecify verison 下选择版本,install package
(3)直接把site-package.rar包selenium放进去,site -packages 替换包
《1》如果安装报错:pip版本太低
《2》记得配置pip环境变量
《3》安装出现pip 安装不是内部命令,解决:安装环境变量的问题


调用语句格式
第一步:导入 from selenium import webdriver
第二步:创建一个driver对象来打开浏览器,对浏览器实现操作driver = webdriver.Chrome()
第三步:通过对象谷歌浏览器且输入网址,在用get方法来打开一个网站url driver.get(‘http://gz.duoceshi.cn’)

打开网页的方法
方法一:格式 driver.get( " url")
格式:driver.execute_script(“window.open(‘url’)”)
场景1:driver.execute_script(“window.open(‘http://www.jd.com’)”)
场景2:window=‘window.open(“url”)’#可以通过变量来接收
driver.execute_script(window)#执行脚本

window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+
格式:window.open(pageURL,name,parameters)
pageURL 为子窗口路径 ,name 为子窗口句柄,parameters 为窗口参数(各参数用逗号分隔)

句柄:一个用来表示对象或者项目的表示符,可以用来描述窗体、文件等句柄不能是常量。句柄是一种特殊的智能指针,当一个应用程序要引用其他系统(数据、操作系统)所管理内存块或对象时,就要使用句柄


常用定位语法
1、时间等待中的三种
(1)强制等待 sleep(xx) 例如:time.sleep(10)
(2).隐性等待 implicitly_wait(xx) 例如:driver.implicitly_wait(10)
(3)显性等待 WebDriverWait 

2、drivere.refresh( ) 页面刷新
3.driver.forward( )#切换到下一页
4、driver.set_window_size( 530,960) #设置指定窗口的大小
6、driver.maxmize_window( ) #窗口最大化
7、driver.get_screenshot_as_file(保存路径,图片名称) 截屏
8、退出的两种方式:一种是close ,另一种:quit


四、Selenium中元素定位方法

id定位                   find_element_by_id()

name定                find_element_by_name()

class定                  find_element_by_class_name()

link定位                 find_element_by_link_text()

partial link定位       find_element_by_partial_link_text()

JavaScript定位        document.getElementById("kw").value="duoceshi"

tag定位                  find_element_by_tag_name()

xpath定位                find_element_by_xpath()

css定位                    find_element_by_css_selector()

场景1:id 定位,比如定位百度的输入框 ,输入用到send_keys
格式:driver.find_element_by_id(“kw”).send_keys(“我是name定位”)

场景2:name定位方法,比如百度输入框中找name
格式:driver.find_element_by_name(“wd”).send_keys(“杭州dcs”)

场景3:class定位,以百度中class为例
格式:driver.find_element_by_class_name(‘s_ipt’).send_keys(“class定位”)

场景4:link_text定位 #使用click()点击方法 准确的匹配
格式:driver.find_element_by_link_text(‘值’).click()

场景5:partial_link_text 模糊定位
格式:driver.find_element_by_partial_link_text(‘ao’).click() 

场景6:javascript 定位
格式 js =‘document.getElementById(“id值”).value=“js定位方法”’
          driver.execute_script(js) 

场景7:tag_naem定位(标签定位)
格式inputs =drvier.find_elements_by_tag_name(‘input’)     通过elements来找到当前百度中所有的input标签
         for i in inputs: #遍历所有input标签
         if i.get_attribute(‘tag_name’)==‘wd’:                                通过input标签定位
         i.send_keys(’’)

场景8:xpath定位 
格式:driver.find_element_by_xpath(xpath表达式)
两个定位1、绝对定位:特点:1.以单斜杠/开头;2.从页面根元素(HTML标签)开始,严格按照元素在HTML页面中的位置和顺序向下查找

                  2、相对定位特点:1.以双斜杠//开头;2.不考虑元素在页面当中的绝对路径和位置;3.只考虑是否存在符合表达式的元素即可。
                      使用标签名+节点属性定位   语法://标签名[@属性名=属性值]
                    // 表示相对路径,从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
                    . 选取当前节点
                      选取当前节点的父节点

                     匹配任何元素节
                    *@匹配任何属性节点
                     @选取属性
                      
                     xpath定位写法://[@id=“form”]/span[1]
                                              //*[@id=“kw”]
                      
                     
找父级的方法(通过标签找到指定定位的元素)
当前输入框的标签是:input标签-我要定位的地址在这个地址中输入文本
input标签的上一级是:span标签
格式:driver.find_element_by_xpath('//*[@id="form"]/span[1]/input[1]').send_keys("父级定位")

当找父级无法找到的时候:找父级的爷爷级
索引值从1开始
xpath=driver.find_element_by_xpath(’//[@id=“form”]/span/input’)
xpath.send_keys(‘根据层级查找定位’)
eg:
xpath=driver.find_element_by_xpath(’//[@id=“form”]/span[1]/a[1]’).send_keys(‘通过input标签名’)     

直接手写且引用当前标签中已有的元素
id 除了xpath元素中必须要添加单或者双引号其它都不需要

通过class元素来定位
格式:xpath=drvier.find_element_by_xpath(’//*[@class=“s_ipt”]’).send_keys(‘xpath中class元素定位!’)

通过:autocomplete="off"元素来定位
格式:xpath=drvier.find_element_by_xpath(’//*[@autocomplete=“off”]’).send_keys(‘xpath中其他属性定位’)

通过and来实现定位格式:xpath=drvier.find_element_by_xpath(’//*[@name=“wd” and @class=“s_ipt”]’).send_keys(‘多个组合属性定位xpath’)



场景9css定位
格式:driver.find_element_by_css_selector(‘值’)
定位元素=右键copy  copy selector
eg:driver.find_element_by_css_selector("[id='kw']").send_keys("我是css定位")   (css中直接输入id属性名和属性值定位)
简写定位方法:driver.find_element_by_css_selector(".s_ipt").send_keys('')
name定位方法:driver.find_element_by_css_selector("[name='wd'].send_keys(")
css中id组合属性定位:driver.find_element_by_css_selector("input#kw").send_keys
css上级定位: driver.find_element_by_css_selector
                      ("span>input").send_keys("我是cds中上级定位")
                      driver,find_element_by_css_selector
                       ("from>span>input").send_keys("我是中上上级定位")

id定位: id前加#号,driver.find_element_by_css_selector(’#kw’).send_keys(‘我是css中的id加#’) 
            id中直接使用id值,driver.find_element_by_css_selector(’[id=“kw”]’).send_keys(‘我是css中的id和值 ‘)

 class定位:class前加上.(点号),driver.find_element_by_css_selector(’.s_ipt’).send_keys(‘我是css中的class’)
name定位:driver.find_element_by_css_selector(’[name=“wd”]’).send_keys(‘我是css中的name’)

组合属性定位:
id组合属性定位:driver.find_element_by_css_selector(“input#kw”).send_keys(‘我是css组合id’)
class组合属性定位:driver.find_element_by_css_selector(“input.s_ipt”).send_keys(‘我是css组合class’)
其他属性组合定位:driver.find_element_by_css_selector(“input[name=‘wd’]”).send_keys(‘我是css组合name’)
仅有属性名,没有值也可以:driver.find_element_by_css_selector(“input[id]”).send_keys(‘我是css仅有属性名’)


两个其他属性组合定位
css有两个属性:driver.find_element_by_css_selector("[name=‘wd’][autocomplete=‘off’]") 
其他属性定位:driver.find_element_by_css_selector(’[autocomplete=off].send_keys('其他属性定位')

~表示值由多个空格隔开,匹配属其中一个值的方法
driver.find_element_by_css_selector(’[id ~=kw]’).send_keys('')

^表示匹配属性值字符开头的方法
driver.find_element_by_css_selector(’[id ^=kw]’).send_keys(‘开头是kw’)

$表示匹配属性值字符结尾的方法
driver.find_element_by_css_selector(’[id $=kw]’).send_keys(")


css.send_keys(‘找上级定位’)
格式:driver.find_element_by_css_selector(‘form>span>input’).send_keys('')


elements是复数,返回的是一个列表
id复数定位find_elements_by_id(self, id_)
name复数定位find_elements_by_name(self, name)
class复数定位find_elements_by_class_name(self, name)
tag复数定位find_elements_by_tag_name(self, name)
link复数定位find_elements_by_link_text(self, text)
partial_link复数定位find_elements_by_partial_link_text(self, link_text)
xpath复数定位find_elements_by_xpath(self, xpath)

css复数定位find_elements_by_css_selector(self, css_selector)
方法一:driver.find_elements(“css selector”, “.mnav”)[5].click()
方法二:driver.find_elements_by_class_name(“mnav”)[5].click()    注意从索引0开始 


五、python+selenium实现UI自动化元素定位总结
9种常用的定位方法中,优先顺序
(1)有id优先使用id定位
(2)没有id,考虑使用name或者class定位
(3)如果没有id,name,class再考虑用xpath,css定位
(4)如果链接可以考虑使用link_text,partial_link_text定位
  (5)tag_name和javaScript还是用的比较少的


六、实战案例
实战案例1:(知识点:文本框,密码框,点击,输入)
url:“http://cms.duoceshi.cn/cms/manage/login.do”
知识点:文本框,密码框,点击,输入
url:“http://cms.duoceshi.cn/cms/manage/login.do”
成功登陆cms案例(输入账号,输入密码,点击登陆)内容管理系统

from selenium import webdriver
from time import *
driver=webdriver.Chrome()
url=“http://cms.duoceshi.cn/cms/manage/login.do”
driver.get(url)
sleep(2)
driver.maximize_window()
sleep(2)
driver.find_element_by_id(‘userAccount’).send_keys(‘admin’)
sleep(2)
driver.find_element_by_id(‘loginPwd’).send_keys(‘123456’)
sleep(2)
driver.find_element_by_id(‘loginBtn’).click()
sleep(10)
driver.close()

实战案例二 (定位:百度输入框和百度按钮)
  from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
url=“http://www.baidu.com”
driver.get(url)
sleep(3)
driver.find_element_by_class_name(“s_ipt”).send_keys(“杭州多测师教育科技有限公司”)
driver.maximize_window()
sleep(3)
driver.find_element_by_id(“su”).click()
百度中的贴吧链接按钮
定位链接
from selenium import webdriver
from time import *
driver=webdriver.Chrome()
url=“http://www.baidu.com”
driver.get(url)
sleep(2)
driver.maximize_window()
sleep(2)
driver.find_element_by_link_text(“贴吧”).click()

按钮
导入类from selenium.webdriver.common.action_chains import ActionChains

from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
from selenium.webdriver.common.action_chains import ActionChains #类
driver.get(‘https://www.baidu.com/’)
driver.maximize_window()
driver.implicitly_wait(10)

高级搜索,隐私设置等a标签查看方法:先定位元素,按ctrl+shift+c,挪到鼠标

第一种方法直接定位
driver.find_element_by_id(‘s-usersetting-top’).click()
sleep(2)
driver.find_element_by_link_text(‘搜索设置’).click()
driver.find_element_by_link_text(‘隐私设置’).click()
sleep(3)
driver.find_element_by_link_text(“高级搜索”).click()
sleep(5)
driver.close()

第二种通过:ActionChains类来模拟鼠标点击悬停
语法:d =driver.find_element_by_id(‘s-usersetting-top’)
          ActionChains(driver).move_to_element(d).perform()
         
           ActionChains()括号中接当前浏览器对象
           move_to_element()括号中接当前你要模拟悬停的具体元素位置
           .perform()对当前的位置进行点击悬停(类似于鼠标放在上面的动作)’’’
             river.find_element_by_link_text(‘搜索设置’).click()

悬浮
from selenium import webdriver
from time import *
from selenium.webdriver.common.action_chains import ActionChains
driver=webdriver.Chrome()
url=“http://www.baidu.com”
driver.get(url)
sleep(2)
driver.maximize_window()
sleep(2)
s=driver.find_element_by_link_text(“更多”)
ActionChains(driver).move_to_element(s).perform()
sleep(4)
driver.find_element_by_link_text(“网盘”).click()
sleep(6)
driver.close()

ActionChains类(鼠标操作)常用于模拟鼠标的行为,比如单击、双击、拖拽等行为
click(on_element=None) — 鼠标单击
double_click(on_element=None) — 双击
context_click(on_element=None) — 右击
click_and_hold(on_element=None) — 鼠标单击并且按住不放
drag_and_drop(source,target) — 拖拽
drag_and_drop_by_offset(source,xoffset,yoffset) — 将目标拖动到指定的位置
key_down(value,element=None) — 按下某个键盘上的键
key_up(value,element=None) — 松开某个键
move_by_offset(xoffset,yoffset) — 鼠标从当前位置移动到某个坐标
move_to_element(to_element) — 鼠标移动到某个元素
move_to_element_with_offset(to_element,xoffset,yoffset)— 移动到距某个元素(左上角坐标)多少距离的位置
perform() — 执行链中的所有动作
release(on_element=None) — 在某个元素位置松开鼠标左

获取元素文本(text) 使用text获取文本
from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()
driver.get(‘http://www.baidu.com’)
driver.maximize_window()
sleep(2)
xp=driver.find_element_by_xpath(’//*[@id=“u1”]/a’).text
if xp==‘登录’:
print(‘OK’)
else:
print(‘NO’)

if判断,执行结果不一致和一致,程序会运行,
s=driver.find_element_by_id(“s-usersetting-top”).text
if s==“不设置”:
print(“ok”)
else:
print(“no”)



assert断言
assert判断表达式的条件成不成立,如果不成立就会立刻返回错误,而不用等到程序执行完成崩溃后,其相当于if not 表达式
案例一:
from selenium import webdriver
driver=webdriver.Chrome()
driver.get(‘https://www.baidu.com/’)
print(driver.title)

案例二:
a = 5
assert (a>1)
print(“断言成功,程序继续进行”)

案例三:
from selenium import webdriver
from time import *
driver=webdriver.Chrome()
url=“http://www.baidu.com”
driver.get(url)
assert(driver.title==“百度一下,你就知道”)
print(“断言成功,程序继续进行”)



实战案例三:下拉框
url :https://www.ctrip.com/
from selenium import webdriver
from selenium.webdriver.support.ui import Select#导入类
from time import sleep
driver=webdriver.Chrome()
url =‘https://www.ctrip.com/?sid=155952&allianceid=4897&ouid=index’
driver.get(url)
driver.maximize_window() #窗口最大化
sleep(8)

定位下拉选择框(索引值从0开始)
s =driver.find_element_by_id(‘J_roomCountList’) #找到当前下拉框的位置
#Select(s).select_by_index(5) #通过索引来定位下拉值,从0开始
#Select(s).select_by_value(‘6’) #通过value来找到对应的值
Select(s).select_by_visible_text(‘6间’) #通过文本值

alert 弹框
from selenium import webdriver
from time import sleep
drvier=webdriver.Chrome()
url="file:///C:/Users/Administrator/Desktop/第二月课程/UI自动化/alert弹框.html"
drvier.get(url)
drvier.maximize_window()
sleep(2)
atl =drvier.switch_to.alert #切换进入到弹框中
atl.accept() #点击确定按钮
atl.dismiss() #点击取消按钮

enter 弹框

url="file:///C:/Users/Administrator/Desktop/第二月课程/UI自动化/enter.html"


输入性弹框

url='file:///C:/Users/Administrator/Desktop/第二月课程/UI自动化/prompt.html'
drvier.get(url)
drvier.maximize_window()
sleep(2)
drvier.find_element_by_class_name('alert').click()#点击确定按钮
sleep(2)
s=drvier.switch_to.alert #切换进入到 alert弹框中
.send_keys('http://www.baidu.com'


、实战案例iframe框

url:https://www.jd.com/

京东商城

from selenium import webdriver

from time import sleep

driver=webdriver.Chrome()

url=‘https://www.jd.com/’

driver.get(url)

driver.maximize_window()

sleep(4)

driver.find_element_by_link_text(‘你好,请登录’).click() #点击登录
sleep(2)

driver.find_element_by_class_name(‘QQ-icon’).click() #点击QQ头标


iframe框定位:有些元素如果换了多种方法都无法定位,且元素正常,首先判断一下你当前定位的位置是否是有iframe,如何查找:从当前元素往上找,通过元素定位iframe,如何切换进入当前元素对应的iframe框

第一种方法  ifrme =driver.find_element_by_id(‘ptlogin_iframe’) #当前iframe的位置

                    driver.switch_to.frame(ifrme) #通过switch_to.frame 切换进入到当前的iframe框中


第二种方法:通过索引来切换

drvier.switch_to.frame(0) #通过索引值为0的iframe来实现进入iframe框

第三种方法:通过tag_name                

drvier.switch_to.frame(drvier.find_element_by_tag_name(‘iframe’))

#drvier.find_element_by_id(‘img_out_812462278’).click()

driver.switch_to.default_content() #退出弹框

sleep(4)

driver.find_element_by_link_text(‘QQ登录服务协议’).click()

QQ登录 :/html/body/div[1]/div/div/a[1]


退出弹框使用iframe定位后需退出iframe

from selenium import webdriver
from time import sleep
driver=webdriver.Chrome()    


退出iframe,再操作

driver.switch_to_default_content() # 回到主页面


当friframe = find_element_by_xpath("//div/iframe")

switch_to_frame(iframe)

#退出iframe:                       当frame不存在id或者class时,可以用xpath的方式进行定位


第一种方式:跳出所有iframe,回到主界面

案例iframe:

from selenium import webdriver

from time import *

driver=webdriver.Chrome()

url=“https://www.jd.com/”

driver.get(url)

sleep(2)

driver.maximize_window()

sleep(3)

driver.find_element_by_link_text(“你好,请登录”).click()

sleep(4)

driver.find_element_by_class_name(“QQ-icon”).click()

sleep(5)

s=driver.find_element_by_id(“ptlogin_iframe”)

driver.switch_to.frame(s) #进入弹框

sleep(4)

driver.find_element_by_link_text(“帐号密码登录”).click()

sleep(3)

driver.switch_to.default_content()#退出弹框

sleep(4)

driver.find_element_by_link_text(“QQ登录服务协议”).click()


实战案例5 滚动条定位
场景一:
document.documentElement.scrollTop  文本.文本元素.window对象方法
window对象方法

j =‘window.scrollTo(0,10000)’  #0表示为顶端,1000表示从顶端往下滑动的距离#(距离没有参考自己把握)

drvier.execute_script(j)

sleep(2)

j =‘window.scrollTo(0,0)’ #返回顶端

drvier.execute_script(j)


通过java语法var设置变量的方法

js代码如何实现滑动浏览滚动条:将滚动条滑至距窗口顶部1000PX

 js=‘var d=document.documentElement.scrollTop=1000’   

drvier.execute_script(js)

sleep(2)

js=‘var d=document.documentElement.scrollTop=0’

drvier.execute_script(js)

场景二

Python 来实现自动增加的滑动,设置一个值为:5000 从0开始依次加1000 当满足5000的时候终止

drvier.implicitly_wait(20)

n =0

while n<=5000:

n+=1000

js=‘var d=document.documentElement.scrollTop=’+str(n)

drvier.execute_script(js)

sleep(2)


场景三:模拟键盘操作(keys)

Keys:模拟我们电脑的键盘操作(快捷键,全部选择,剪切,粘贴,空格,回车。

语法:(from selenium.webdriver.common.keys import Keys #导入Keys类)


from selenium import webdriver

import time

from selenium.webdriver.common.keys import Keys #导入Keys类

driver=webdriver.Chrome()

url=‘http://www.baidu.com’

driver.get(url)

driver.maximize_window()

time.sleep(4)

driver.find_element_by_id(‘kw’).send_keys(‘duoceshi’)

time.sleep(3)


control+a全部选择

driver.find_element_by_id(‘kw’).send_keys(Keys.CONTROL,‘a’)

time.sleep(3)

driver.find_element_by_id(‘kw’).send_keys(Keys.CONTROL,‘x’)   control+x剪切

time.sleep(3)

driver.find_element_by_id(‘kw’).send_keys(Keys.CONTROL,‘v’)  control+v粘贴

driver.find_element_by_id(‘kw’).send_keys(Keys.ENTER)  enter回车


实例案例  代码进行通过函数来封装

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import *
driver=webdriver.Chrome()
url="https://www.baidu.com/"
driver.get(url)
sleep(2)
driver.maximize_window()
sleep(3)
def a(b,*c):
return driver.find_element_by_id(b).send_keys(*c)
if __name__ == '__main__':
a('kw','杭州西湖')
a('kw',Keys.CONTROL,'a')
a('kw', Keys.CONTROL, 'x')
a('kw', Keys.CONTROL, 'v')
a('kw', Keys.ENTER)

七实例案例切换窗口
场景一:两个链接在统同一个窗口
from selenium import webdriver
from time import *
driver=webdriver.Chrome()
url=“http://www.baidu.com/”
driver.get(url)
sleep(3)
url2=“http://www.jd.com”
driver.get(url2)

场景二:两个链接在两个不同的窗口
url2="window.open('http://www.jd.com')"
driver.execute_script(url2)

当两个窗口打开时,判断当前属于哪一个页面,通过driver.title获取
print(driver.title)
driver.find_element_by_link_text(“你好,请登录”).click()

场景三:切换当前窗口(当出现两个链接的情况下)
句柄(handle)再调试的时候,如果点开的是一个链接,可以手动拖下,看他是否会重新打开一个窗口,如果会,就是一个句柄了


评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册