UI自动化

Posted zcok168

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UI自动化相关的知识,希望对你有一定的参考价值。

selenium:
ide -录制
webdriver -库 提供了网页的操作方法

pip3 install -U selenium
安装:ie-ieserberdriver
chrome-chromedriver
firefox-geckodriver

浏览器驱动:http://npm.taobao.org/mirrors/chromedriver/
驱动版本与浏览器需要匹配,最好关闭浏览器更新功能

通信流程:
1.xxxdriver(浏览器驱动)启动,ip+端口监听
2.python selenium webdriver跟浏览器驱动建立链接,发送http请求
3.浏览器驱动收到指令,驱动浏览器做操作
4.浏览器驱动把结果返回给 python selenium webdriver
5.继续发下一个http请求
6.最后断开链接,关闭驱动,关闭浏览器



定位方式:
1.根据元素属性来查找元素:
id
name
class_name 只支持一个class值
tag_name

2.只针对a元素:
link_text
partial_link_text

3.多个属性组合查找元素:
xpath
css_selector


from selenium import webdriver
import time

# 启动Chrome浏览器
driver = webdriver.Chrome()

# 打开百度首页
driver.get("http://www.baidu.com")

# 最大化窗口
driver.maximize_window()

# 设置成浏览器窗口大小,宽400,高600
driver.set_window_size(400, 600)

#沉睡5秒
time.sleep(5)

driver.get("http://www.taobao.com")

# 退回到百度首页
driver.back()

# 前进到淘宝页面
driver.forward()

#刷新
driver.refresh()

#关闭当前窗口
driver.close()

#退出webdriver程序
driver.quit()


# elements匹配多个元素返回列表

#id
driver.find_element_by_id(‘kw‘).send_keys(‘selenium‘)

#class
#只能匹配class属性中的一个值
driver.find_element_by_class_name(‘s_ipt‘).send_keys(‘selenium12‘)

#name
driver.find_element_by_name(‘wd‘).send_keys(‘selenium14‘)

#tag
# html是通过tag来定义功能的,比如input是输入,table是表格等.每个元素其实就是一个tag,很难通过tag去区分不同的元素仅了解就行。下面代码仅做参考,运行时必定报错
# driver.find_element_by_tag_name(‘input‘).send_keys(‘selenium16‘)


#link_text
# 此种方法是专门用来定位文本链接的
driver.find_element_by_link_text(‘新闻‘).click()

#partial_link_text
# 一个超链接的文本很长很长如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。
driver.find_element_by_partial_link_text(‘消‘).click()


#Xpath
driver.find_element_by_xpath("//*[@id=‘kw‘]").send_keys(‘selenium‘)

绝对定位:
以/开头,父/子顺序, full xpath
/html/body/div[3]/div[4]/div/div[1]/div/h2/a, html下面的body下面的第三个div......
//*[@id="guonei"]/div[1]/div/h2/a

相对定位:(定位不要有下标不要单斜杠,越灵活越好)
以//开头
1.标签名[@属性=值],如果不是唯一就继续往父亲爷爷找
//a[@href="/guonei"]
//*[@*="/guonei"]:通配只要结果等于guonei

2.层级定位(使用最多)://一级元素//二级元素......
//div[@class="civilnews"]//a[@href="/guonei"]

3.文本定位://标签名[text()=值]
//a[text()="公告"]

4.包含定位,可以包含属性和文本://标签名[contains(@属性/text(),值)]
属性://a[contains(@href,"/Notify/index/courseid/")]
文本://a[contains(text(),"公告")]

5.逻辑运算定位 来组合更多元素特征,and or
//标签名[@属性=值 or @属性=值]
//标签名[@属性=值 and @属性=值 and contains(@属性/text(),值) and text()=值]

//a[text()="公告" and contains(@href,"/Notify/index/courseid/")]


6.轴定位:关系定位,一般应用场景是表格样式的数据列,需要用组合来定位元素
a.通过兄弟姐妹找到自己
b.通过后代元素找到祖先元素

轴运算:
ancestor:所有的祖先包括父亲
parent:父亲借点
preceding:当前元素节点之前的所有节点(html页面的先后顺序)
preceding-sibling:当前元素节点之前的所有兄弟节点
following:当前元素节点之前的所有节点(html页面的先后顺序)
following-sibling:当前元素节点之后的所有兄弟节点
语法:
已知元素/轴名称::标签名称[@属性=值]
例如,根据写忆找到阿花 ://p[@title="写忆"]/parent::*/following-sibling::li//p[@class="name"]
先找写忆》再找写忆的父亲》再找他父亲的弟弟》根据他父亲的弟弟找到需要的元素,默认是第一个,如果不是第一个用下标再找
//p[@title="路飞"]/preceding-sibling::p[@class="stuno"]
//p[@title="路飞"]/following-sibling::p[@class="stuno"]


7.下标、js


#css
# 这种方法相对xpath要简洁些,定位速度也要快些,但是学习起来会比较难理解,
driver.find_element_by_css_selector(‘#kw‘).send_keys(‘selenium‘)


等待:
1.页面跑不过代码
2.设备原因,性能
3.页面渲染

等待操作以:显性为主,sleep为辅
1.sleep >强制等待
2.智能等待:最多愿意等10秒,如果在10秒内出现就继续下一行代码,超时异常:TimeoutException,NosuchElementException
隐形等待:2种场景,a.每个会话中只调用一次适用全局,会话就是打开浏览器到quit关闭的整个过程,
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get(‘http://www.baidu.com‘)
b.元素存在可见,元素被找到
显性等待:在你需要的地方直接用显性等待,那个地方需要用在哪个地方
等待:等待上限 - 15秒,轮询周期 - 多少秒去确认一下条件是否成立,默认是0.5
条件:专门的条件模块,Expected_condition
WebDriverWait(driver,15,0.5).until/not_until(条件)

from selenium.webdriver.support.wait import WebDriverWait,类
from selenium.webdriver.support import expected_conditions as EC,模块

loc = ("xpth",‘//p[@title="路飞"]/following-sibling::p[@class="stuno"]‘)
WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc))

三大切换之窗口切换:

窗口切换,简单来说就是在原来的页面窗口下打开了一个新的窗口,需要要新的窗口中,去进行下一步的操作。

因此 需要知道:

1)怎么知道需要切换到哪个窗口?

2)代码程序怎么知道哪个窗口是新的窗口?

步骤:

1)得到目前打开的所有窗口。

这里要引入句柄的概念,每个窗口都有一个句柄。

所有窗口显示集合是一个列表。其顺序是:先出现的,先追加到列表;新的窗口,在列表的最后。

即最先打开的窗口,在列表第一个;

# 获取所有的窗口句柄
wins = driver.window_handles
print(wins)

2)切换到新窗口

# 切换到新的窗口
driver.switch_to.window(wins[-1])
print("切换之后的句柄:",driver.current_window_handle)

3)在新的窗口里,定位元素操作元素

示例:

这里以在百度中输入“”搜索selenium webdriver“”,并在搜索结果中找到官网(切换到官网窗口),执行下载文件操作。

import time
from  selenium import  webdriver
from selenium.webdriver.common.by import By
from  selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 1、打开访问百度
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com/")

# 2、在百度首页输入框中输入selenium webdriver
# 1)定位到百度首页输入框:根据ID定位
# 2)在输入框中输入:selenium webdriver
# 3)点击百度一下:根据ID定位,后加点击操作_click()
element = driver.find_element_by_id("kw")
element.send_keys("selenium webdriver")
driver.find_element_by_id("su").click()

# 3、在搜索到的页面结果中找到 - SeleniumHQ Browser Automation
loc =(By.XPATH, //a[text()=" - SeleniumHQ Browser Automation"])
# 使用隐性等待10秒,构建使得loc元素是可见的
WebDriverWait(driver,20).until(EC.visibility_of_element_located(loc))
# 触发新的窗口出现:找到 - SeleniumHQ Browser Automation元素后,点击跳转到先窗口
driver.find_element_by_xpath(//a[text()=" - SeleniumHQ Browser Automation"]).click()
# 强制等待1秒
time.sleep(1)

# 4、获取所有的窗口句柄
wins = driver.window_handles
print(wins)

# 5、获取自己当前所在的窗口句柄
print(driver.current_window_handle)

# 6、切换到新的窗口
driver.switch_to.window(wins[-1])
print("切换之后的句柄:",driver.current_window_handle)

# 7、在新的窗口等待查找的元素,并对元素进行点击操作
loc2 = (By.XPATH,//div[@class="download-button webdriver"])
WebDriverWait(driver,15).until(EC.visibility_of_element_located(loc2))
driver.find_element(*loc2).click()

# 8、退出会话
time.sleep(5)
driver.quit()

 三大切换之iframe和Alert切换

一、web窗口之iframe窗口切换

首先,iframe是html里面的html页面。

若遇到要操作的元素,在iframed当中,则需要进行此操作。

操作步骤:

1)判断要操作的元素是否在iframe当前,可使用元素定位方法进行判断;

2)若1中判断元素存在。则需要再判断切换到哪个iframe中。

3)切换方法:

driver.switch_to.frame()

参数支持3种方式来确定切换到哪个一个iframe:

#1) iframe下标 从0开始
driver.switch_to.frame(3)

#2) iframe元素的name属性
driver.switch_to.frame("login_frame_qq")

#3) iframe这个webElment元素。
driver.switch_to.frame(driver.find_element_by_xpath(//iframe[@name="login_frame_qq"]))

具体实现的流程:

1)打开访问的页面;

2)根据元素定位等操作,进入到有iframe的页面;

3)操作到有iframe的页面当中,且后面的操作,是在此iframe中找到元素并操作;

4)切换到iframe窗口,进入下一代html当中

driver.switch_to.frame("iframe窗口_名称")

5)在firame窗口中定位元素操作;

6) 回到默认的html页面当中 - 第一代
driver.switch_to.default_content()

7)回到上一级的iframe - 上一代
driver.switch_to.parent_frame()

import time
from  selenium import  webdriver
from selenium.webdriver.common.by import By
from  selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 1、打开访问腾讯课堂
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://ke.qq.com/")

# 2、根据xpath定位当前页面登录按钮,点击登录进入QQ登录窗口
loc = (By.XPATH,//a[@id="js_login"])
WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc))
driver.find_element_by_xpath(//a[@id="js_login"]).click()

# 3、强制等待1秒
time.sleep(1)

# 4、在新的弹窗中找到QQ登录按钮,点击进入QQ登录账号密码输入框
loc2 = (By.XPATH,//i[@class="icon-font i-qq"])
WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc2))
driver.find_element_by_xpath(//i[@class="icon-font i-qq"]).click()

# 5、在QQ账号登录窗口
loc3 =(By.XPATH,//iframe[@name="login_frame_qq"])
WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc3))
driver.find_element_by_xpath(//iframe[@name="login_frame_qq"]).click()

# 6、切换到新的iframe的窗口
driver.switch_to.frame("login_frame_qq")

# 7、在QQ登录窗口定位到QQ账号信息
loc4 =(By.XPATH,//*[@id="img_out_1xxxx"])
WebDriverWait(driver,20).until(EC.visibility_of_element_located(loc4))
driver.find_element_by_xpath(//*[@id="img_out_1xxxx"]).click()

# 9、退出会话
time.sleep(10)
driver.quit()

 

二、web窗口之Alert(弹窗)切换

很多时候我们会遇到弹窗,且必须对弹窗操作后才能对页面进行操作。弹窗的优先级比网页中的任意元素高;

这里就以这种类型的窗口进行操作。

步骤:

1)点击触发操作,触发弹窗出现;

driver.find_element_by_id("press").click()

2)等待弹窗出现;

3)将操作切换到弹窗;

driver.switch_to.alert

4)将弹窗关掉,进行下一步的页面处理操作

print(alert.text)
alert.accept

例子:

"""
alert类
"""
import time

from  selenium import  webdriver

driver = webdriver.Chrome()
driver.get("E:WorkspacepythonWebclass_05_0307MyHtml.html")

# 点击动作,触发弹框出现
driver.find_element_by_id("press").click()
# 等待弹窗出现
time.sleep(1)

# 切换弹窗
alert = driver.switch_to.alert

# 将弹窗关掉,进行下一步的页面处理
print(alert.text)
alert.accept()

# 关闭会话
time.sleep(5)
driver.quit()

三大操作(鼠标,下拉列表,按键操作)

一、鼠标操作

参数都是元素对象,除了与坐标有关的函数外;

函数名:ActionChains 动作链

常见的鼠标操作:

1)悬浮 move_to_element
2)点击 click
3)双击 double_click
4)右键 context_click
5)拖拽 drag_and_drop
6)暂停 pause
7)输入 send_keys

操作步骤:

1)将要执行所有鼠标的动作,先放到一个列表当中。

2)perform() : 执行鼠标动作。

示例:

示例:
在百度首页中的设置中找到高级设置((鼠标悬浮在设置上后出现高级设置))

import time

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com/")

# 1、找到鼠标要操作的元素(百度首页的设置)
loc = (By.XPATH, //div[@id="u1"]//a[@name="tj_settingicon"])
ele = driver.find_element(*loc)
ele.click()

# 2、实例化Actonchains类
ac = ActionChains(driver)

# 3、调用鼠标行为(悬浮)
ac.move_to_element(ele)

# 4、调用perform()来执行鼠标动作
ac.perform()
time.sleep(2)

# # 注: 若将2、3、4操作结合到一起
# ActionChains(driver).move_to_element(ele).perform()

# 5、等待 下拉列表中元素可见
loc2 = (By.XPATH, //a[text()="高级搜索"])
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc2))

# 6、选择想要操作的元素
# 触发高级搜索内容出现
driver.find_element(*loc2).click()

二、下拉列表操作(Select类)

使用Select类进行操作

1)初始化,传select对象;

2)根据下标、value属性、文本内容来选择值;

示例:

在上面案例的基础上操作(对百度高级设置中的文件格式下拉框进行选择操作)

from selenium.webdriver.support.select import Select

# 1、初始化,传select对象
loc3 = (By.XPATH, //select[@name="ft"])
WebDriverWait(driver, 10).until(EC.visibility_of_element_located(loc3))
select_element = driver.find_element(*loc3)

s = Select(select_element)

# 2、根据下标 value属性、文本内容来选择值
# 根据下标选值
s.select_by_index(6)
time.sleep(3)
# 根据value属性选值
s.select_by_value("doc")
time.sleep(3)
# 根据文件内容选值
s.select_by_visible_text(RTF 文件 (.rtf))
time.sleep(3)

# 3、关闭会话
time.sleep(5)
driver.quit()

三、键盘操作(Keys类)

Keys类中处理特殊键

示例:

在百度首页找到搜索输入框,输入内容后,点击百度一下的鼠标操作使用enter键替代

import time
from  selenium import webdriver
from  selenium.webdriver.common.keys import  Keys

# 1、打开访问百度首页
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://www.baidu.com")
# 2、找到搜索输入框,输入selenium webdriver,按enter键进行搜索
element = driver.find_element_by_id("kw")
element.send_keys("selenium webdriver", Keys.ENTER)
# 3、关闭会话
time.sleep(5)
driver.quit()

send_keys(Keys.F12)
#键盘F12 send_keys(Keys.ESPACE)#回退键Esc send_keys(Keys.BACK_SPACE)#删除键BackSpace element.send_keys(Keys.CONTROL,"c")# ctrl+c 复制 driver.refresh()#刷新页面重新加载(相当于F5) driver.find_element_by_id("kw").send_keys(Keys.PageDown)#下拉页面(相当于滑动下拉框到底部)

 

 


以上是关于UI自动化的主要内容,如果未能解决你的问题,请参考以下文章

ui自动化测试是啥

UI自动化和selenium相关以及八大定位

(appium+python)UI自动化_07_UI自动化实例拼多多搜索商品为例

Web UI自动化测试之Selenium3

(selenium+python)_UI自动化12_web UI自动化实例(以京东搜索加车为例)

UI 自动化测试平台解决方案使用 Selenium IDE 录制 UI 自动化测试脚本