python+selenium实现UI自动化

一、环境安装

  • python开发环境

    • python解释器

    • pycharm编辑器

  • 安装selenium包

'''
默认下载最新版本
'''
pip install selenium   
  • 安装浏览器

    • chrome

    • firefox

  • 安装浏览器驱动

  •  chrome:

    • 先查看本地谷歌浏览器版本号

    • 去指定的网址查找和的本地浏览器相匹配浏览器驱动程序的版本

    • 配置浏览器驱动程序的环境变量(将驱动程序直接拷贝到python解释器的安装目录即可)

二、脚本编写基本步骤

# ① 导包
import time
​
from selenium import webdriver
​
# ② 打开浏览器-创建浏览器驱动对象
driver = webdriver.Chrome()
# ③ 输入网址
driver.get("http://baidu.com")
# ④ 暂停3s,业务操作
time.sleep(3)
# ⑤ 关闭浏览器
driver.quit()

三、API

鼠标操作

# 1.导包


# 2.创建鼠标对象
mouse_action = ActionChains(driver)


# 3.调用鼠标操作指令方法
'''
鼠标右击(右击的元素对象,使用元素定位方法定位到)
'''
mouse_action.context_click

'''
鼠标悬停(所要悬停的元素对象)
'''
mouse_action.move_to_element

'''
鼠标拖拽(拖动的元素对象,目标位置的元素对象)
'''
mouse_action.drag_and_drop

# 4.执行指令
mouse_action.perform()

 特殊按键操作

# ① 输入字符串
element.send_keys()
# ② 模拟单个按键输入
element.send_keys(Keys.BACKSPACE)

# ③ 模拟组合按键输入
element.send_keys(Keys.CONTORL,'c')

# ④ 对于input标签上传文件控件进行上传文件
# 注意:如果想使用该方法上传文件,HTML上传文件标签名必须为input
driver.find_element_by_name("upfile1").send_keys(r"路径.html")
​

 浏览器操作

# 1.窗口最大化
driver.maximize_window()

# 2.刷新页面
driver.refresh()

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

# 4.关闭浏览器
driver.quit()

# 5.获取当前窗口标题
driver.title

# 6.获取当前窗口url
driver.current_url

元素等待

隐式等待

'''
- 注意:
  - 一般写在创建浏览器驱动对象之后
  - 对于该代码之后的所有元素定位都生效,全局设置
  - 最大超时时长一般设置为10~30s
  - 超时异常为:NoSuchElementException
- 缺点:需要等待整个界面加载完毕才会继续向后运行

'''
driver.implicitly_wait(30)

显示等待

'''
- 注意:
  - 显示等待不受整个界面加载的影响,只要所定位元素加载出来即继续运行代码
  - 显示等待只对单个元素生效
  - 超时异常为:TimeOutException
'''
WebDriverWait(driver, 10, 0.5).until(lambda x: x.find_element_by_css_selector("[placeholder*='延时']"))

下拉框

  • HTML标签中有两种实现形式:

    • select+option标签原生态下拉框

    • 非select标签自定义下拉框

  • 下拉框处理方式

    • 两种实现形式实现的下拉框都可以使用元素定位方式来实现选项选择

    • 基于select原生态的下拉框可以使用selenium提供Select对象来进行选择

当打开界面时,默认已加载出来的元素都可以直接进行定位和操作

  • Select对象处理select标签下拉框的方式

# 创建下拉框对象
select_city = Select(driver.find_element_by_id("selectA"))
# a.选择广州,暂停2s,通过下标选择
select_city.select_by_index(2)

# b.选择北京,暂停2s,通过value属性值
select_city.select_by_value("bj")

# c.选择深圳,暂停2s,通过文本
select_city.select_by_visible_text("深圳")

弹出框

  • 认识弹出框类型

    • 自定义弹出框:直接触发弹出框之后通过元素定位方式直接进行处理即可

    • JS弹出框

    区分方式:直接右键检查弹出框,如果能够检查元素信息,则是自定义弹出框,如果无检查新信息,则是js弹出框

  • JS弹出框处理方式

# 1.获取弹出框对象
alert = driver.switch_to.alert
# 2.取消弹出框.部分js弹出框无取消按钮,但是取消方法一样可以取消掉弹出框
alert.dissmiss()
​
# 确认弹出框
alert.accept()
​
# 获取弹出框文本
alert.text

滚动条

# ① 定义js字符串,如想将滚动条翻到最底部或最右侧只需要设置scrollTo中值足够大即可
js_str = "window.scrollTo(0,2000)"
# ② 执行js字符串
driver.execute_script(js_str)

 元素定位

  • 自动化要代替手工测试执行操作步骤,就需要先找到界面信息(元素),代码要找到界面上的元素,就需要依赖界面元素的具体标签信息来查找。

  • 元素自身的标签信息:标签名、属性信息

  • 有id选择id,无id看name属性,无name看class,无class属性看其它属性以及组合属性

  • 属性都不能定位,则看层级关系

  • 层级关系无法精准定位则定位一组元素

  • 定位一组元素不行,则绝对路径

  • 元素的层级结构

元素定位方法执行之后返回的是:元素对象

如果匹配到多个符合条件的元素对象,默认返回第一个符合条件元素对象

如果找不到元素对象则会抛出异常:NoSuchElementException

1、id定位方式

'''
优先级:有id时优先使用id的定位方式
'''
driver.find_element_by_id("s-top-loginbtn")

2.name定位方式

'''
优先级:低于id定位方式
'''
driver.find_element_by_name("tj_login")

3.class_name定位方式

'''
优先级:低于name定位方式
'''
driver.find_element_by_class_name("s-top-login-btn c-btn c-btn-primary c-btn-mini lb")

4.tag_name定位

'''
优先级:标签名定位优先级较低,因为界面标签名重复性过高
'''
driver.find_element_by_tag_name("a")

5.超链接定位

'''
- link_text
定位访问 百度 网站(参数必须为超链接的全部文本内容)
''' 
driver.find_element_by_link_text("访问 百度 网站").click()

'''
- partial_link_text
- 使用局部文本定位,在挑选局部文本时必须是一节连续不间断的字符信息
- 所挑选局部文本信息是所要定位超链接元素所特有的,方便精准定位
'''
driver.find_element_by_partial_link_text("百度 ").click()

5.定位一组元素

'''
- 定位一组元素返回数据类型是列表
- 列表中存储数据为所有匹配到元素对象
- 想取具体的元素对象则直接加上下标,下标从0开始
'''
input_login = driver.find_elements_by_tag_name('id')
print(input_login)
input_login[96].click()

6.xpath定位

方法:driver.find_element_by_xpath(xpath表达式)

在xpath中如果匹配到多个符合条件元素,可以加下标,但是起始值为1

(1)路径定位

  • 绝对路径-从最外层元素(html标签)到目标要定位元素的之间所有经过的元素层级-不建议使用

  • 相对路径-从任意层级开始查找目标元素

    • 采取方式:倒推表示

    • 以//开始,后面每个层级用单斜杠连接

    • /* 表示匹配界面所有元素

'''
a.使用绝对路径定位,点击按钮
'''
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[4]/a")

'''
b.暂停2s,使用相对路径定位,点击按钮
'''
time.sleep(2)
driver.find_element_by_xpath("//*[@id="s-top-loginbtn"]")

(2)属性定位策略

注意:xpath使用class属性时和class_name定位使用class有区别,class_name定位使用的是class的其中一个类名,而xpath用的是所有的类名

  • 利用元素自身的属性来进行定位,只要是目标元素所拥有的属性都可以用来定位。

  • 在选择属性时:保障定位到的元素是唯一的

'''
//*[@属性名='属性值']  //标签名[@属性名='属性值']
使用属性定位百度输入框输入测试
'''
driver.find_element_by_xpath("//*[@autocomplete="off"]").send_keys("测试")

 (3)属性与逻辑结合

  • 当一个属性无法精准定位到具体的元素对象时,可以选择多个属性来同时限制,一般不会超过2个。

'''
使用属性定位用户名输入框输入admin
'''
driver.find_element_by_xpath("//*[@name='user' and @class='login']").send_keys("test")

   (4)属性与层级结合

  • 当元素自身的信息无法精准定位时,可以先定位其父级元素,再定位子元素

'''
使用属性定位百度输入框输入测试
'''
driver.find_element_by_xpath("//*[@id='form']/span/input[1]").send_keys("测试")

css定位方式

  • css定位相对xpath定位简洁,而且更快。

  • 定位方式:driver.find_element_by_css_selector('css表达式')

    • 或者:driver.find_element(By.CSS_SELECTOR,'css表达式')

  • 定位策略

    • id选择器#id属性值

    • class选择器.class属性的其中一个类名

    • 元素选择器标签名

    • 属性选择器[属性名='属性值'] 或者 标签名[属性名='属性值']

      • 局部属性值[属性名*='局部属性值']

      • 属性与逻辑结合 [属性名1='属性值1'][属性名2='属性值2']

    • 层级选择器

      • 定位目标元素时自身的信息不太方便精准定位,可以先定位其父级元素或者祖辈元素,先限制查找的区间范围

      • 后代选择器元素对象1 元素对象2

        • 元素对象1 表示使用选择器定位到的祖辈区间元素

        • 元素对象2 表示目标要定位的元素对象


异常总结

  • UnexpectedAlertPresentException:js弹出框未处理

  • NoSuchElmentException:找不到元素对象异常

    • 元素定位写错

    • 没有设置元素等待

    • 缺少操作步骤

    • 没做窗口切换

    • 没做frame切换

  • list type no attribute send_keys-->***类型 type no attribute ***属性或方法

    • 在调用对象中的属性和方法时,没有指定属性或方法

  • TimeOutException:隐式等待超时

你可能感兴趣的:(python,ui,自动化)