文件上传
因为文件上传涉及到调用os选择框,该弹出框非web浏览器,所以常规方法无法定位,因此选用更为灵活的第三方库PyUserInput–模拟键盘操作。现在用一个简单业务来说明下该模块的使用方法。
业务场景:
用户点击‘添加文件’按钮–》弹出本地文件选择框-〉选择文件后确认,完成文件上传
基本思路:
使用模拟键盘操作完成该功能(以mac为例)
‘shift+command+G’:可以直接调出文件路径输入框,填写对应路径就能选择文件
‘return’:模拟enter操作
具体代码实现:
from pykeyboard import PyKeyboard #用来模拟键盘操作
import pyperclip #实现复制粘贴引用的模块
file_path = '/path/1.png'
#点击‘文件上传’按钮
driver.find_element(By.XPATH, '//button[@class="button-select-file"]')
k = PyKeyboard()
filepath = '/'
k.press_keys(['Command', 'Shift', 'G'])
# 复制粘贴方式给文件路径添加一个'/'
pyperclip.copy(filepath)
k.press_keys(['Command', 'V'])
time.sleep(2)
#输入文件路径
k.type_string(file_path)
time.sleep(4)
k.press_key('Return')
time.sleep(4)
k.press_key('Return')
实现该功能时的一些注意事项:
- 引用 ‘from pykeyboard import PyKeyboard’时pip install PyUserInput即可,不要pip install pykeyboard,这样会导致引用失败。
- 直接使用‘type_string(file_path)’方式输入文件路径时,file_path中的第一个‘/’无法被识别,比如你file_path=‘/test/i.png’,直接使用‘type_string(file_path)’时会显示为‘test/i.png’,导致无法找到文件。因此引用‘pyperclip’模块,将‘/’以复制粘贴方式写在文件路径里即可。
- 直接使用‘pyperclip’复制粘贴方式把完整的file_path写到文件路径里,会导致后面的模拟enter操作失败。
文件下载
下载文件从功能测试角度来讲,我们主要测试两点:a. 文件可以下载 b.下载后的文件可以正常查看。
但是要做自动化测试的话,我们只能做到第1点,即:验证文件可正常下载到指定文件夹。
基本思路:
1.指定下载后文件的存储位置
2.下载操作结束后在指定存储位置能找到该文件即可
代码实现:
第一步:指定下载后文件的存储位置
在这里以chrome浏览器为例,要做的就是直接给chromedriver添加一个额外默认下载地址的即可;
#设置下载的默认地址
chromeOptions = webdriver.ChromeOptions()
prefs = {"download.default_directory": "/Users/test/Desktop/gk"}
chromeOptions.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(chrome_options=chromeOptions)
第二步:
检查指定文件夹内包含已下载的文件:
import os
#os.path.isfile()会返回一个bool类型,当文件存在时会返回True
assert os.path.isfile('/Users/test/Desktop/gk/test-down-load.png') == True
#删除指定文件夹下的指定文件
# def delete_file_in_folder(self, file_path,file_name):
# try:
# filepath = os.path.join(file_path, file_name)
# if os.path.isfile(filepath):
# os.remove(filepath)
# except Exception as e:
# print ('--删除失败--')
常见下拉框:
select类
这种直接用webdriver提供的select类处理
因为暂时没找到select标签写的下拉框,在这里直接把之前看的selenium3实战书上写的例子贴上来:
定位及使用方法:
非select类(click()后点击后显示下拉框)
业务描述:
点击‘我的主页’后弹出下拉框,选择‘我的资源’并进入对应页面
页面代码如下:
定位方法如下:
#先定位到'我的主页',点击触发下拉框的显示
driver.find_element(By.XPATH, '//a[@ng-click="showNavigationList()"]').click()
#获取所有的li标签下对象,通过循环获取各个对像的text文本来定位到'我的资源'
all_elements = driver.find_elements(By.XPATH, '//div[@data-category="顶部导航"]/ul/li')
for i in all_elements:
if '我的资源' in i.text:
i.click()
break
非select类(鼠标悬浮后显示下拉框)
业务描述:
鼠标悬浮至‘+新增’按钮上后会显示一个下拉菜单,在下拉框中选择‘文件’后点击能跳转到对应页面
页面代码如下:
定位方法如下:
from selenium.webdriver.common.action_chains import ActionChains
#鼠标悬浮至'+新增'来触发下拉框显示
#定位到'+新增'
ele = driver.find_element(By.XPATH, '//a[@class="button more-button narrow create"]')
#使用ActionChains来移动到指定位置
ActionChains(driver).move_to_element(ele).perform()
#直接定位到'文件'的位置,click()即可
driver.find_element(By.XPATH, '//div[@class="dropdown-list zh-CN"]/ul//li[1]').click()