selenium模块

1、什么是UI自动化

通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。

2、UI自动化的优点

  1. 解决重复性的功能测试和验证
  2. 减少测试人员在回归测试时用例漏测和验证点的漏测
  3. 减少冒烟测试,回归测试的人力成本,节省时间,提高效率

3、UI自动化的缺点

  1. 需求不稳定,比如,敏捷开发速度快,UI频繁变革,定位不稳定,提高用例维护的成本
  2. 用例熟料的覆盖率,占用例总数的20%-30%
  3. 场景覆盖占当前功能场景78%-80%

4、Selenium介绍

Selenium是一个应用于web应用程序的测试工具,支持多平台,多浏览器。多语言去实现ui自动化测试。

Selenium测试紫荆运行在浏览器中,就像真正的用户在操作一样,支持的浏览器包括IE,Firefox,Safari,Google Chrome等。

selenium是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)

selenium优点

  • 工具免费
  • 安装简单,小巧,selenium其实就是一个包
  • 支持多语言(java,python)+selenium完成自动化测试
  • 支持多平台(window,linux)
  • 支持多浏览器(IE,Firefox,Chrome)

5、Selenium工作原理

webdriver是按照client-server设计原理设计

client:简单来说就是我们写的代码,以HTTP的请求方式发送给server端,server端接收请求,执行相应操作,并返回给client端。

server:客户端的脚本启动后,被控制的浏览器就是server端,职责就是等待client端发送请求并作出反应。

使用协议:JSON Wire protocol(可以让同一个浏览器驱动处理不同编程语言的脚本)

6、selenium安装

1、在dos窗口用pip命令安装selenium 命令:pip3 install selenium

2、配置谷歌驱动文件

把chromedriver放置在对应python安装目录的Scripts下如:D:\python3.7\Scripts

谷歌驱动对应版本镜像链接:http://npm.taobao.org/mirrors/chromedriver/

7、selenium操作

基本语句:

# 导入
from selenium import webdriver
# 实例一个对象来打开浏览器,对浏览器操作
driver = webdriver.Chrome()
# 打开网址如打开百度
driver.get('http://www.baidu.com') 	

# execute——script("window.open('url')")
# 在新的窗口打开链接

driver.refresh()  # 刷新
driver.back()   # 后退一步
dirver.forward()  # 前进
driver.set_window_size(530,960) # 指定浏览器窗口大小
driver.maxmize_window()  # 窗口最大化
driver.get_screenshot_as_file()  # 截屏
driver.close()  # 关闭浏览器中的页面
driver.quit()  # 关闭浏览器

时间等待三种

  1. 强制等待 sleep() 例如:time.sleep(10)
  2. 隐性等待implicitly_wait() 例如:driver.implicitly_wait(10) 在这个时间内一个完成就做另一个
  3. 显性等待WebDriverWait
1、selenium中元素定位的方法

在这九种常用的定位方法中,优先排序

  1. 有id优先使用id
  2. 没有id,考虑使用name或者class定位
  3. 如果没有id,name,class,在考虑用xpath,css定位
  4. 如果是链接可以考虑使用link_text,partial_link_text定位
  5. tag_name和JavaScript还是用的比较少的

id定位

通过id定位到百度输入框,然后输入内容搜索

driver.find_element_by_id('kw').send_keys('美女')

driver.find_element_by_id('su').click()

name定位

driver.find_element_by_name('wd').send_keys('duoceshi')

class定位

driver.find_element_by_class_name('s_ipt').send_keys('duoceshi')

link_text定位 精准匹配

driver.find_element_by_link_text('hao123').click()

partial_link_text定位 模糊匹配

driver.find_element_by_partial_link('ao1').click()

JavaScript定位

js = document.getElementById("kw").value="duoceshi"

driver.execute_script(js)

tag_name定位

a = driver.find_elements_by_tag_name('input')

for i in a:

​ if i.get_attribute('id') == 'kw':

​ i.send_keys('duoceshi')

Xpath定位

driver.find_element_by_xpath('//*[@id="kw"]').send_keys('duoceshi')

driver.find_element_by_xpath('//input[@name="wd"]').send_keys('duoceshi')

1、绝对定位:

特点:1.以单斜杠/开头;2.从页面根元素(HTML标签)开始,严格按照元素在HTML页面中的位置和顺序向下查找

2、相对定位:(我们一般都是用相对定位来定位的)

特点:1.以双斜杠//开头;2.不考虑元素在页面当中的绝对路径和位置;3.只考虑是否存在符合表达式的元素即可。

img

img

#直接复制的方法
xpath=drvier.find_element_by_xpath('//*[@id="kw"]')
xpath.send_keys('直接id复制是xpath')
# 引用:id 除了xpath元素中必须要添加单或者双引号其它都不需要
xpath =drvier.find_element_by_xpath('//*[@id="kw"]')
xpath.send_keys('直接id复制是xpath')
# 通过标签名称来
xpath =drvier.find_element_by_xpath('//input[@id="kw"]')
xpath.send_keys('通过input标签名')
# 通过name元素来实现
xpath =drvier.find_element_by_xpath('//*[@name="wd"]')
xpath.send_keys('xpath中name定位')
# 通过class元素来定位
xpath=drvier.find_element_by_xpath('//*[@class="s_ipt"]')
xpath.send_keys('xpath中class元素定位!')
# 通过:autocomplete="off"元素来定位
xpath=drvier.find_element_by_xpath('//*[@autocomplete="off"]')
xpath.send_keys('xpath中其他属性定位')
# 通过and来实现定位
xpath=drvier.find_element_by_xpath('//*[@name="wd" and @class="s_ipt"]')
xpath.send_keys('多个组合属性定位xpath')

css定位

driver.find_element_by_css_selector('#kw').send_keys('duoceshi')
driver.find_element_by_css_selector('[id="kw"]').send_keys('duoceshi')
driver.find_element_by_css_selector('.s_ipt').send_keys('duoceshi')
driver.find_element_by_css_selector('[class="s_ipt"]').send_keys('duoceshi')
driver.find_element_by_css_selector('input.s_ipt').send_keys('duoceshi')
driver.find_element_by_css_selector('input[name="wd"]').send_keys("cuoceshi")
driver.find_element_by_css_selector('[name="wd"][autocomplete="off"]').send_keys(“duoceshi”)

常用控件文本框、密码框、按钮
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
url = 'http://cms.duoceshi.cn/cms/manage/login.do'
driver.get(url)
driver.maximize_window()
# 在账户输入admin
driver.find_element_by_id('userAccount').send_keys('admin')
sleep(2)
# 在密码输入框里输入密码
driver.find_element_by_id('loginPwd').send_keys('123456')
# 点击登录按钮
# driver.find_element_by_id('loginBtn').click()
# 点击取消按钮
driver.find_element_by_class_name('btn-default').click()
常用控件链接和隐藏框

链接通常是a标签,以百度首页左上角更多举例可以通过鼠标悬停上,右键检查定位到HTML文件内的具体内容

隐藏框通常是js代码动态加载生成一个就可以按照上边的方式以百度首页右上角设置举例,还有可以打开开发者工具鼠标点击设置后,按Ctrl+|打开Paused in debugger

拓展知识:

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)   ---  在某个元素位置松开鼠标左
获取元素文本和获取窗口title
# 获取元素文本和获取窗口title
from selenium import webdriver

driver = webdriver.Chrome()
url = 'http://www.baidu.com'
driver.get(url)
# 获取窗口的title
print(driver.title)

# 获取标签的文本值
print(driver.find_element_by_xpath('//*[@id="s-top-left"]/a[7]').text)
断言
from selenium import webdriver

driver = webdriver.Chrome()
url = 'http://www.baidu.com'
driver.get(url)
a = driver.find_element_by_xpath('//*[@id="s-top-left"]/a[7]').text
assert (a == '学术')
print('断言成功,请继续')
assert (a != '学术')
# 错误不运行,直接报错
print('断言失败,程序停止') 
常用控件下拉框
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)
s = driver.find_element_by_id('J_roomCountList')

# 根据索引取值  索引从0开始
Select(s).select_by_index('3')

# 通过标签的value属性值取值
Select(s).select_by_value('4')

# 通过标签的文本值取值
Select(s).select_by_visible_text('4间')
弹框:alert弹框

分类:警告型弹框,确认型弹框,输入型弹框

# 确认型
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
url = r'F:\flask_projects\dcs\ui_zidonghua\enter.html'
driver.get(url)
sleep(1)
driver.find_element_by_class_name('alert').click()
a = driver.switch_to.alert
sleep(1)
# a.accept()  # 确认
a.dismiss()  # 取消
sleep(2)
driver.quit()

# 输入型
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
url = r'F:\flask_projects\dcs\ui_zidonghua\prompt.html'
driver.get(url)
sleep(1)
driver.find_element_by_class_name('alert').click()
a = driver.switch_to.alert
sleep(1)
a.send_keys('123')
sleep(3)
a.accept()

# 文件上传
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import Select
dr = webdriver.Chrome()
url = r"F:\flask_projects\dcs\ui_zidonghua\upload_file.html"
dr.get(url)
s = dr.find_element_by_id('file')
s.send_keys(r"F:\flask_projects\dcs\ui_zidonghua\弹框上的确定按键.html")
iframe框

场景: 京东官网-登录--qq 登录 qq登录界面

from time import sleep
from selenium import webdriver
from selenium.webdriver.support.ui import Select
dr=webdriver.Chrome()
url='https://graph.qq.com/oauth2.0/show?which=Login&display=pc&response_type=code&state=B2DF8AA2B585B0D5FCA5F23441E72416A1FBA229F9AECDA7A2BFFDE38470B88B39E925912784A5B937BFD7A597D4D106&client_id=100273020&redirect_uri=https%3A%2F%2Fqq.jd.com%2Fnew%2Fqq%2Fcallback.action%3Fview%3Dnull%26uuid%3Df23f2023f4d44dfd953baca4329520a0'
dr.get(url)
sleep(3)
iframe=dr.find_element_by_id('ptlogin_iframe') # 找到ifame框的元素
dr.switch_to.frame(iframe) #切换到iframe #通过iframe框切换进入ifame框
dr.find_element_by_link_text('注册新帐号').click()
dr.switch_to.default_content() #退出iframe
sleep(2)
dr.find_element_by_link_text('QQ登录服务协议').click()
滚动条
# 第一种
from selenium import webdriver
from time import sleep
dr = webdriver.Chrome()
url = 'https://www.jd.com'
dr.get(url)
sleep(3)
js = 'window.scrollTo(0,1000)'
# 滚动条的定位, 0表示顶端(上), 1000表示从顶端上向下滑动的举例。
dr.execute_script(js)
sleep(2)
js = 'window.scrollTo(0,0)'  # 返回顶端
dr.execute_script(js)

# 第二种java语法:var 设置变量方法
from selenium import webdriver
from time import sleep
dr = webdriver.Chrome()
url = 'https://www.jd.com'
dr.get(url)
sleep(3)
js = 'var d=document.documentElement.scrollTop=1000'
dr.execute_script(js)
sleep(2)
js1 = 'var d=document.documentElement.scrollTop=0'
dr.execute_script(js1)

# 每次下拉1000
from selenium import webdriver
from time import sleep
dr = webdriver.Chrome()
url = 'https://www.jd.com'
dr.get(url)
sleep(3)
for i in range(5):
    js = f'var d=document.documentElement.scrollTop={i*1000}'
    dr.execute_script(js)
控件keys类
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
dr = webdriver.Chrome()
url = 'https://www.baidu.com/'
dr.get(url)
sleep(2)
dr.maximize_window()
dr.find_element_by_id('kw').send_keys('dcs')
sleep(2)
dr.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')
sleep(2)
dr.find_element_by_id('kw').send_keys(Keys.CONTROL, 'x')
sleep(2)
dr.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v')
sleep(2)
dr.find_element_by_id('kw').send_keys(Keys.ENTER)

# 通过封装实现
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
dr = webdriver.Chrome()
url = 'https://www.baidu.com/'
dr.get(url)
sleep(2)
dr.maximize_window()


def a(b, *c):
    return dr.find_element_by_id(b).send_keys(*c)


if __name__ == '__main__':
    a('kw', 'dcs')
    a('kw', Keys.CONTROL, 'a')
    a('kw', Keys.CONTROL, 'x')
    a('kw', Keys.CONTROL, 'v')
    a('kw', Keys.CONTROL)
窗口切换
# 两个窗口
from selenium import webdriver
from time import sleep
dr = webdriver.Chrome()
url = 'http://www.baidu.com'
dr.get(url)
# url = 'window.open("https://www.baidu.com/")'
# dr.execute_script(url)
print(dr.title)  # 百度一下,你就知道
sleep(2)
url1 = "window.open('https://www.jd.com/')"
dr.execute_script(url1)
print(dr.title)  # 百度一下,你就知道
#js=dr.current_window_handle #获取当前的句柄
#print(js)
jss = dr.window_handles #获取所有的句柄
print(jss)
# ['CDwindow-F413FFB5715D29DF970C6E54ACB6824E', 'CDwindow-25E37E5434FBB8CD881E07B96A8F328B']
sleep(2)
dr.switch_to.window(jss[0]) #根据索引切换窗口
# dr.find_element_by_link_text('你好,请登录').click()
#大于两个窗口
三个窗口的切换通过索引切换,
第一个0 2 最后一个1

0表示第一个窗口
2表示中间一个窗口 dr.switch_to.window(jss[2]) #根据索引切换窗口
1表示最好后一个窗口
from selenium import webdriver
from time import sleep
dr = webdriver.Chrome()
url = 'http://www.baidu.com'
dr.get(url)
# url = 'window.open("https://www.baidu.com/")'
# dr.execute_script(url)
print(dr.title)  # 百度一下,你就知道
sleep(2)
url1 = "window.open('https://www.jd.com/')"
dr.execute_script(url1)
print(dr.title)  # 百度一下,你就知道
sleep(2)
dr.execute_script("window.open('https://www.cnblogs.com/xiaolehua/p/14130007.html')")
#js=dr.current_window_handle #获取当前的句柄
#print(js)
sleep(2)
jss = dr.window_handles #获取所有的句柄
print(jss)
# ['CDwindow-F413FFB5715D29DF970C6E54ACB6824E', 'CDwindow-25E37E5434FBB8CD881E07B96A8F328B']
sleep(2)
dr.switch_to.window(jss[0]) #根据索引切换窗口
# dr.find_element_by_link_text('你好,请登录').click()
sleep(2)
dr.switch_to.window(jss[1])
sleep(2)
dr.switch_to.window(jss[2])
# 多个窗口的切换,切换窗口,判断title来切换,
from selenium import webdriver
from time import sleep
dr = webdriver.Chrome()
url3 = 'http://discuz.e70w.com/'
dr.get(url3)
sleep(2)
url = "window.open('https://www.baidu.com/')"
dr.execute_script(url)
sleep(2)
url1 = "window.open('https://www.jd.com/')"
dr.execute_script(url1)
jss = dr.window_handles  # 获取所有的句柄
for i in jss:
    dr.switch_to.window(i)
    if '百度一下,你就知道' in dr.title:
        dr.find_element_by_id('kw').send_keys('dcs')
        break

posted @ 2021-03-11 21:12  世界快乐  阅读(102)  评论(0)    收藏  举报