selenium+Python 实现web ui自动化


预想实现selenium+Python的UI自动化,需要如下步骤

一、搭建好Python环境+Pycharm工具

二、安装selenium库、webdriver库

pip install selenium
pip install pywin32

三、安装浏览器及webdriver

1、webdriver下载地址

chrome--需要下载与浏览器版本一致的驱动版本
http://chromedriver.storage.googleapis.com/index.html
https://registry.npmmirror.com/binary.html?path=chromedriver/

fixfox--只需下载对应平台的驱动即可
https://github.com/mozilla/geckodriver/releases

Edge:--需要下载与浏览器版本一致的驱动版本
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

2、将下载的driver.exe文件,放到python目录中,并配置好环境变量

例如我的目录是:D:\software\Python3.6

3、在python中使用webdriver

a)通过Pycharm工具使用Python语言导入所需库

from selenium import webdriver
from selenium.webdriver.common.by import By

b)指定webdriver

driver = webdriver.Chrome('D:\workspace\web_selenium\chromedriver.exe')# 若配置了环境变量,则不用传webdriver路径,直接()即可,如下:
driver = webdriver.Firefox()
driver = webdriver.Ie()

c)设置窗口大小web窗口最大化

# 将web窗口最大化
方法:maximize_window()
示例:
driver.maximize_window()
# 将浏览器窗口设置固定大小 示例:
driver.set_window_size(540,960)

d)输入被测域名

方法:driver.get(url)
示例:driver.get('https://www.baidu.com/')

四、元素定位

webdriver提供了如下8种元素定位方法,我们这里重点讲XPATH方法

 1、元素定位方法

By.XPATH(),采用XPATH方式进行定位--重点讲解
By.ID(),采用id属性进行定位
By.NAME(),采用name属性进行定位
By.LINK_TEXT()
By.PARTIAL_LINK_TEXT()
By.TAG_NAME()
By.CLASS_NAME()
By.CSS_SELECTOR()
2、使用XPATH方法定位元素
元素定位步骤:
a)浏览器F12
b)使用元素定位功能,点击需要操作的位置
c)查看Elements中的前端源代码,通过标签进行定位
 
 
以上图为例,可以通过以下方式定位到元素:
//a[text()="去注册"]
//a[@href="#/reg"]
//a[@slot="jump"]
以上图为例,可以通过以下方式定位到元素:
//button[@type="button"]
//button[@class="btn-primary"]
//button[text()="我要提问"]

3、查找到的元素在python的使用

语法:
driver.find_element(By.XPATH,'//button[@type="button"]').click() 
driver.find_element(By.XPATH,'//button[@class="btn-primary"]').click()
driver.find_element(By.XPATH,'//button[text()="我要提问"]').click()

4、这里推荐一个chrome的XPATH定位插件,可以测试精准的定位到元素,再放到代码中,更容易排查问题

工具:XPath Helper

 5、使用其他的定位方式

语法示例:
diver.find_element(By.CLASS_NAME, 'download').click()
diver.find_element(By.ID, 'download').click()

复数定位:
假设同一个元素定位后存在多个结果,可以使用find_elements方法+下标的方式定位到想要定位的位置,如:
diver.find_elements(By.ID, 'download')[3].click()

五、模拟常见操作

 1、打开网页

方法:get(url)
示例:driver.get('https://www.xxx.com/')

2、等待时间

需要使用python自带的time模块,传入秒数
import time
示例:time.sleep(5)

3、点击操作

方法:click()
示例:driver.find_element(By.XPATH,'//span[text()="登录/注册"]').click()

4、输入内容

方法:send_keys()
示例:
driver.find_element(By.XPATH,
'//input[@type="tel"]').send_keys('xxx') driver.find_element(By.XPATH,'//input[@type="password"]').send_keys('xxx')

5、清空内容

方法:clear()
示例:
driver.find_element(By.XPATH,'//input[@type="password"]').clear()

6、回退到上一页、前进到下一页

后退方法:back()
示例:
driver.back()

前进方法:forward()
示例:
driver.forward()

7、模拟键盘操作

输入空格
.send_keys(Keys.SPACE)
点击退格(调用一次点击一次)
.send_keys(Keys.BACK_SPACE)
全选操作ctrl+a
.send_keys(Keys.CONTROL,'a')
复制操作ctrl+c  
.send_keys(Keys.CONTROL,'c')
 剪切操作ctrl+x  
.send_keys(Keys.CONTROL,'x')
 粘贴操作ctrl+v  
.send_keys(Keys.CONTROL,'v')
通过回车来代替单击操作
.send_keys(Keys.ENTER)
F1--F12
.send_keys(Keys.F1)
还有很多键盘上的其他操作,使用时可以通过Keys.py类进行查看
# 需要导入Keys()类,该类提供了键盘上几乎所有的按键方法,可以用来模拟键盘按键,包括各种组合键,如Ctrl+A, Ctrl+X,Ctrl+C, Ctrl+V 等等
from selenium.webdriver import Keys

示例:
# 先定位元素,在操作复制,ctrl+c ,方法:.send_keys(Keys.CONTROL,'c') 
driver.find_element(By.XPATH,'//input[@id="payeeAccount"]').send_keys(Keys.CONTROL,'c') 

# 先定位元素,在操作粘贴,ctrl+v ,方法:.send_keys(Keys.CONTROL,'v')
driver.find_element(By.XPATH,'//input[@id="payeeAccount"]').send_keys(Keys.CONTROL,'v')

 8、上传文件

前置步骤:
a)安装库 pip install pywin32 b)导入库
import win32gui import win32con c)windows中安装工具:WinSpay,用于定位窗口元素拿到Class值

工具百度网盘提取 https:
//pan.baidu.com/s/1DRX3m8Xa0iHSzKXH25PMRw 79gt
代码示例:
upload = driver.find_element(By.XPATH,'//i[@class="cropControlUpload"]').click() # 点击上传按钮
time.sleep(5)

self.file_uplode() # 调用上传文件方法

def file_uplode(self):
    # 一级窗口,每个浏览器的title名字不一样
    if self.browser == 'chrome':
    # Chrome弹出的上传文件窗口,title为“打开”
        dialog = win32gui.FindWindow("#32770", '打开')
    else:
    # Firefox弹出的上传文件窗口,title为“文件上传”
        dialog = win32gui.FindWindow("#32770", '文件上传')
    # 打开窗口,地址栏输入框的class元素为ComboBoxeEx32
    ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None)
    # 文件名输入框后方的图片格式下拉框的class元素为ComboBox
    comboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, "ComboBox", None)
    # 文件名输入框的class元素为Edit
    edit = win32gui.FindWindowEx(comboBox, 0, 'Edit', None)
    # 打开按钮的class元素为Button
    button = win32gui.FindWindowEx(dialog, 0, 'Button', '打开(&O)')

    # 输入文件路径
    win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, r'C:\Users\User\Desktop\测试图片\3.jpg')
    # 点击“打开”按钮
    win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)
    time.sleep(3)

 9、鼠标悬停

# 需要使用ActionChains库,代码示例:

from selenium.webdriver import ActionChains

# 找到需要悬停的页面元素
link1 = self.driver.find_element(By.XPATH, '//img[@src="xxx/assets/头像@3x.afb74138.png"]')
# 找到第二个需要悬停的页面元素
link2 = self.driver.find_element(By.XPATH, '//span[text()="小白菜无花果"]')

# 模拟鼠标悬停操作
ActionChains(self.driver).move_to_element(link1).perform()
time.sleep(3)

# 在悬浮框中点击元素
ActionChains(self.driver).move_to_element(link2).click()
time.sleep(3)

10、对页面进行截屏

方法:get_screenshot_as_file()
示例:
driver.get_screenshot_as_file("D:\\b1.png")

11、刷新页面

方法:refresh()
示例:
driver.refresh()

12、关闭当前标签页

方法:close()
示例:
diver.close()

13、关闭新打开的标签网页

参照:https://jingyan.baidu.com/article/6c67b1d6b849822787bb1e00.html

代码示例:

# 浏览器窗口句柄,原网页为句柄0,新网页为句柄1,依此类推
windows = self.diver.window_handles
# 定位到预想关闭的浏览器标签中 diver.switch_to.window(windows[1]) # 对这个句柄为1的标签操作关闭 diver.close() sleep_time(2) # 回到原标签中,继续后续操作 diver.switch_to.window(windows[0]) sleep_time()

而如果是打开多个网页。首先打开网页1,再点击网页1上一个链接,在新窗口打开新网页2,同理点击新网页2上一个链接,新窗口打开新网页3等等,这是按打开顺序为网页编号。实际网页对应句柄如下图所示,即第一个打开网页一直是句柄0,而最新打开的网页记为句柄1,依次序编号。

14、关闭浏览器,释放进程

方法:quit()
示例:
diver.quit()