Python+Selenium自动化测试

1.selenium介绍

  1. Selenium是最广泛使用的开源Web UI(用户界面)自动化测试套件之一。
  2. selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
  3. selenium也是支持无界面浏览器操作的

2.selenium的使用步骤

#1.导包
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#2.初始化一个火狐浏览器实例
driver = webdriver.Firefox()
#3.打开web页面
URL= "http://blog.csdn.net"
derive.get(URL)
#4.停留时间
time.sleep(10)
#5.退出驱动
drive.quit()

3.浏览器前进&后退&刷新

#浏览器前进
driver.forward()
#浏览器后退
driver.back()
#浏览器刷新,设置刷新一定要等待几秒
driver.refresh()
time.sleep(5)

4.窗口切换

在selenium操作页面的时候,可能会因为点击某个链接而跳转到一个新的页面,这时候selenium实际还处于上一个页面,需要我们进行切换才能够定位最新页面上的元素。

#获取所有窗口句柄
handles=driver.window_handles
#切换到最新窗口
driver.switch_to.window(handles[-1])

5.窗口截图

通常UI自动化测试的时候是无人值守的,同时错误信息记录不是很明确,有截图的情况下能快速分析错误原因

#截图文件的绝对路径
driver.get_screenshot_as_file('图片保存路径')
derive.save_screenshort('test.png')
#截取后直接是二进制
derive.save_screenshort_as_png()

6.鼠标悬停

作用一般是为了显示隐藏的下拉框

ActionChains(driver).move_to_element().perform()

7.元素定位

元素:在网页上面的文本输入框,按钮,多选,单选,标签和文字都叫元素,总之凡是能在页面显示的对象都可以作为页面元素对象。
元素定位目的:希望在整个html中,快速找到要操作的元素,尽量只匹配到1个。
Selenium一共有八种元素定位方法:

7.1.ID定位

通过页面内元素的ID属性进行定位,前提是这个元素有ID属性

#html
<input type="text" name="enroll" id="user">
#send_keys()表示输入
driver.find_element(By.ID, 'user').send_keys('xxx')
#click()表示单击
driver.find_element(By.ID, 'user').click()

7.2.name定位

通关元素的name属性进行定位,前提是这个元素有name属性

#html
<input type="text" name="enroll">
driver.find_element(By.NAME, 'enroll')

7.3.class_name定位

通过元素的类名进行定位,元素有多种类名,需要挑取一个特有的类名

#html
<input type="text" name="enroll" class="ipt-user">
driver.find_element(By.CLASS_NAME, 'ipt-user')

7.4.tag_name定位

通过标签名定位,但标签重复性非常高,一般不建议使用

#html
<input type="text">
driver.find_element(By.TAG_NAME, 'input')

7.5.link_text定位

专用用来定位超链接标签的,通过a标签内的全部文本内容,定位a标签

#html
<a href="http://news.baidu.com" target="_blank">新闻</a>
driver.find_element(By.LINK_TEXT, '新闻').click()

7.6.partial_link_text定位

有时候,使用link_path无法定位图片元素,则需要使用partial_link_text来定位超链接内局部的文本内容(从字符串任意位置开始,截取连续的字符集)

#html
<a href="http://news.baidu.com" target="_blank">新闻,很多很多新闻</a>
driver.find_element(By.PARTIAL_LINK_PATH, '新闻').click

7.7.定位一组元素

有时候,在定位元素时,会遇到多个符合条件的元素,而且所需要定位的元素不是第一个
需要使用.find_elements(),定位所有符合条件的元素,并返回一个列表,通过列表索引来获取指定元素

#html
用户名:<input type="text" name="enroll" id="user" />
密码:<input type="password" name="enroll" id="password" />
邮箱:<input type="email" name="enroll" id="email" />
#
u
ser = driver.find_elements(By.NAME,'enroll')
user[0].send_keys("yyro11")
user[1].send_keys("yyro12")
user[2].send_keys("[email protected]")

8.Xpath定位

在实际开发自动化脚本过程中,XPath的使用是最多的一种方法

8.1.Xpath路径定位

相对路径:
概念:从目标定位元素的任意层级的上级元素开始到目标元素所经过的层级的路径
表达式:以//开始,后续每个层级都使用/来分割

表达式 描述
/ 根节点
// 当前节点
@class 提取标签属性
text() 获取标签内容
//div[ @class =’ main’] 选取div下class属性为main的div节点
//div[text() = ’ main’] 选取div下标签内容为main的div节点

8.2.Xpath属性定位

利用元素的属性进行定位,还需要精准定位到唯一元素的属性

#html
密码:<input type="password" name="enroll" id="password" />
drive.find_element(By.XPATH, "//*[@id='password']")
drive.find_element(By.XPATH, "//input[@name='enroll']")

8.3.利用and or组合定位

driver.find_element(By.XPATH, "//*[@id=='password' and @name='enroll']")

8.4. 利用元素文本定位:text()

#html
<a href="#">跳转</a>
driver.find_element(By.XPATH, "//*[text()=='跳转']")

8.5. 利用局部属性值定位contains( , )

#html
<a href="#">跳转</a>
driver.find_element(By.XPATH, "//a[contains(text(), '跳')]")
#html
<input type="text" class="bg btn user" />
driver.find_element(By.XPATH, "//input[contains(@class, 'bg')]")

8.6.Xpath层级定位

先定位到其父节点,然后到其子节点

#html
<div id="one">
<input type="submit" class="btn" value="上传" />
</div>
<div id="two">
<input type="submit" class="btn" value="上传" />
</div>
driver.find_element(By.XPATH, "//div[@id='one']/input[@class='btn']")

9. CSS定位

css selector也称为选择器定位,它通过页面内的元素的id、name、tag三个属性来进行定位,根据元素属性的重复程度,可以单独属性定位也可以组合属性进行定位。相较于Xpath定位方式,易用性和维护性更好

#id选择器查找
driver.find_element(By.CSS_SELECTOR, '#xx')
#class选择器查找
driver.find_element(By.CSS_SELECTOR, '.xx')
#tag选择器查找
driver.find_element(By.CSS_SELECTOR, 'xx')
#属性选择器
driver.find_element(By.CSS_SELECTOR,"[name='wd']")
#层级选择器
driver.find_element(By.CSS_SELECTOR,'form > span > input') 
#模糊匹配
input[class ~= "局部关键字"]
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
browser.find_element(By.CSS_SELECTOR, '#kw')
browser.find_element(By.CSS_SELECTOR, '.s_ipt')
browser.find_element(By.CSS_SELECTOR, 'input')
#多属性定位–tag+id属性
browser.find_element(By.CSS_SELECTOR, 'input#kw')
#多属性定位–tag+class属性
browser.find_element(By.CSS_SELECTOR, 'input.s_ipt')

10. 其他方法

1.清除输入框内的内容
elem = driver.find_element(By.XPATH, "//input[@name='wd']")
elem.clear()
2.判断元素是否被选择,一般用于选择框
# 返回 True 或 False
driver.find_element(By.TAG_NAME, "select").is_selected()
3.判断元素是否可用
# 返回 True 或 False
driver.find_element(By.TAG_NAME, "select").is_enabled()
4.判断元素在页面中是否显示
# 返回 True 或 False
driver.find_element(By.TAG_NAME, "select").is_displayed()

11. 执行UI自动化时如果找不到元素该分析哪些原因

1.元素定位代码是否正确
2.是否匹配到唯一元素
3.是否有做元素等待
4.是否需要鼠标悬浮
5.元素是否在新窗口
6.元素是否存在于iframe标签中
7.元素是动态
8.元素在隐藏元素

你可能感兴趣的:(python脚本,python,selenium)