web自动化中的常见问题python3+Selenium+mac环境(一)

本文介绍了如何使用Python的PyUserInput库进行文件上传操作,包括模拟键盘输入选择文件路径,以及处理路径特殊字符问题。同时,针对文件下载测试,阐述了设置默认下载目录并在下载完成后验证文件存在的方法。对于非select类下拉框,分别展示了点击显示和鼠标悬浮显示下拉框的定位与选择策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件上传
文件下载
下拉框的定位

文件上传

因为文件上传涉及到调用os选择框,该弹出框非web浏览器,所以常规方法无法定位,因此选用更为灵活的第三方库PyUserInput–模拟键盘操作。现在用一个简单业务来说明下该模块的使用方法。
业务场景:
用户点击‘添加文件’按钮–》弹出本地文件选择框-〉选择文件后确认,完成文件上传
在这里插入图片描述
使用shift_comand+G调用的文件输入框

基本思路:
使用模拟键盘操作完成该功能(以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')

实现该功能时的一些注意事项:

  1. 引用 ‘from pykeyboard import PyKeyboard’时pip install PyUserInput即可,不要pip install pykeyboard,这样会导致引用失败。
  2. 直接使用‘type_string(file_path)’方式输入文件路径时,file_path中的第一个‘/’无法被识别,比如你file_path=‘/test/i.png’,直接使用‘type_string(file_path)’时会显示为‘test/i.png’,导致无法找到文件。因此引用‘pyperclip’模块,将‘/’以复制粘贴方式写在文件路径里即可。
  3. 直接使用‘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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值