• web自动化测试-webdriver实现


    1.Select下拉列表

    1.1下拉列表单选

    在这里插入图片描述
    在这里插入图片描述

    from selenium import webdriver
    from selenium.webdriver.support.ui import Select
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://sahitest.com/demo/selectTest.htm')
    se = Select(driver.find_element('id', 's1Id')) # 定位下拉列表元素
    
    # 根据索引选择 0-表示第一列
    se.select_by_index(1)  # 结果:选中o1
    
    # 根据值来选择 前端页面value="o2"
    se.select_by_value('o2') # 结果:选中o2
    
    #根据文本选择,下拉列表显示的文字
    se.select_by_visible_text('o3') # 结果:选中o3
    
    #循环打印下拉框选项  options 所有选项
    for options in se.options:
        print(options.text)    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    1.2下拉列表多选

    在这里插入图片描述

    在这里插入图片描述

    from selenium import webdriver
    from selenium.webdriver.support.ui import Select
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://sahitest.com/demo/selectTest.htm')
    # 选择连续的几列
    se = Select(driver.find_element('id', 's4Id')) # 定位下拉列表元素
    for i in range(2, 6):
        se.select_by_index(i) # 显示o2到最后一个
    
    # 选择不连续的几列,结合ctrl键
    from selenium.webdriver.common.action_chains import ActionChains 
    from selenium.webdriver.common.keys import Keys # 使用键盘
    
    element1 = driver.find_element('xpath', '//*[@id="s4Id"]/option[3]') # 定位o2
    element2 = driver.find_element('xpath', '//*[@id="s4Id"]/option[5]') # 定位最后一个
    ActionChains(driver).key_down(Keys.CONTROL).click(element1).key_up(Keys.CONTROL).perform() # 选中o2
    ActionChains(driver).key_down(Keys.CONTROL).click(element2).key_up(Keys.CONTROL).perform() # 选中最后一个
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2.非Select下拉列表

    (1)前端效果是这样的,点击输入框,出现下列列表,选择其中一个
    在这里插入图片描述
    定位输入框,点击,激活下列列表
    在这里插入图片描述在这里插入图片描述
    定位下列列表的列,注意这里使用Google自带的复制xpath,可能定位不准,需要自己手动去定位列的xpath

    在这里插入图片描述

    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('')
    driver.find_element('xpath', '//*[@id="userLayout"]/div/div[2]/div/div/form/div[1]/div/div/span/div').click() # 点击输入框,激活下列列表
    driver.find_element('xpath', '//div[@id="popContainer"]/div[2]/div/div/div/ul/li[38]').click() # 点击列表的第38列
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (2)这种多级下拉列表的与上方雷同。第一级定位点击,激活下一级,第二级定位点击,激活下一级,第三级定位点击。
    在这里插入图片描述

    #定位输入框,点击,激活下拉列表
    driver.find_element('xpath', '//*[@id="popContainer"]/div[1]/div/section/section/main/div/div[2]/div/div/div/div[1]/div/div[2]/form/div/div[1]/div/div[2]/div/span/span').click()
    #第一级定位点击,激活下一级下拉列表
    driver.find_element('xpath', '//*[@id="popContainer"]/div[2]/div/div/div/ul/li[3]').click()
    # 第二级定位点击,激活下一级下拉列表
    driver.find_element('xpath', '//*[@id="popContainer"]/div[2]/div/div/div/ul[2]/li[1]').click()
    # 第三级定位点击
    driver.find_element('xpath', '//*[@id="popContainer"]/div[2]/div/div/div/ul[3]/li[1]').click()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.文件上传

    1.1input单个文件上传

    前端代码
    在这里插入图片描述

    driver.find_element('xpath', '//input[@type="file"]).send_keys('C:\pig\counting-video\5.mp4') # z直接输入文件绝对路径
    
    • 1

    1.2input多个文件上传

    多文件上传就是在文件路径框里用引号括起单个路径,然后用逗号隔开多个路径

    1.3非input文件上传

    前端:点击-》选择图片或视频上传
    在这里插入图片描述
    在这里插入图片描述
    安装下面两个包

    pip install -i https://pypi.douban.com/simple pywin32
    
    • 1
    pip install pyperclip
    
    • 1

    实现文件上传的方法

    # filePath: 要上传的文件地址,绝对路径。
    def Upload_File(filePath):
        # 将文件路径放入剪切板
        pyperclip.copy(filePath)
        time.sleep(2)
        # 发送Ctrl(17)+V(86)按钮
        win32api.keybd_event(17, 0, 0, 0)
        win32api.keybd_event(86, 0, 0, 0)
        # 松开按键
        win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)
        win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)
        time.sleep(1)
    
        # 输入回车键(13),第一次确认路径,第二次提交路径
        win32api.keybd_event(13, 0, 0, 0)
        win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)  # 松开按键
        win32api.keybd_event(13, 0, 0, 0)
        win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)  # 松开按键
        time.sleep(2)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    实现上传

    # 首先定位“请选择视频或图片”,并点击
    driver.find_element('xpath', '//*[@id="popContainer"]//div[3]').click()
    Upload_File(r'D:\testdata\5.mp4') # 注意绝对路径,前面加r,否则\t会被识别为转义字符
    
    
    • 1
    • 2
    • 3
    • 4

    4.鼠标键盘

    在这里插入图片描述
    在这里插入图片描述
    from selenium.webdriver import ActionChains # 鼠标操作的类
    from selenium.webdriver.common import keys #键盘操作的类
    按住ctrl+点击ActionChains,可查看里面有很多方法

    from selenium.webdriver.common.action_chains import ActionChains
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('https://www.baidu.com/')
    item = driver.find_element('id', 's-usersetting-top')
    ActionChains(driver).move_to_element(item).perform() # 模拟鼠标的移动操作
    driver.find_element('link text', '高级搜索').click()
    
    ActionChains(driver).double_click(item).perform() # 双击
    ActionChains(driver).click(item).perform() # 单击
    ActionChains(driver).context_click(item).perform() # 右键
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    from selenium.webdriver.common.Keys import keys
        def test_key(self):
            self.driver.get('htpp://www.baidu.com')
            kw = self.driver.find_element_by_id('kw')
            kw.send_keys('selenium')
            kw.send_keys(Keys.CONTROL, 'a')  # 全选 
            kw.send_keys(Keys.CONTROL, 'c')  # 复制
            kw.send_keys(Keys.CONTROL, 'x')  # 剪切
            kw.send_keys(Keys.CONTROL, 'v')  # 粘贴
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5.多窗口切换

    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.maximize_window()
    
    driver.get('https://www.baidu.com/')  # 默认百度窗口
    current_window = driver.current_window_handle  # 保存当前窗口的句柄
    driver.find_element('link text', '贴吧').click()  # 进入贴吧窗口
    print(len(driver.window_handles))  # 窗口数量,打开了两个窗口
    driver.switch_to.window(driver.window_handles[1])  # 切换到贴吧窗口
    driver.find_element('id', 'wd1').send_keys('上海')  # 在贴吧窗口输入框输入
    driver.switch_to.window(current_window)  # 切回默认百度窗口
    driver.find_element('id', 'kw').send_keys('python')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    6.frame操作定位

    在web应用中经常会出现frame的嵌套应用,假设页面上有A,B两个frame,B在A内,具体思路:
    使用switch_to.frame()方法,把当前定位的主体切换到B frame里
    使用switch_to.default_content()从B frame切换回A frame
    在这里插入图片描述

    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('')
    # 切换到iframe内部的上下文环境中
    driver.switch_to.frame(driver.find_element('name', 'iframe1'))
    driver.find_element('id', 'kw').send_keys('python')
    # 将上下文环境从iframe中切出来
    driver.switch_to.default_content()
    driver.find_element('link text', '去淘宝').click()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    7.滚轮

    driver.execute_script("window.scrollTo(xpos, ypos);") # 可以控制页面上下滚动,左右滚动
    # xpos 表示x坐标 
    # ypos 表示y坐标
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # 表示滑到最低部
    
    • 1
    • 2
    • 3
    • 4

    8.复选框

    前端语句用checkbox类型

    swimming:"checkbox" name="swimming" value="swimming">
    reading:"checkbox" name="reading" value="reading">
    • 1
    • 2
    from selenium import webdriver
    import os
    from time import sleep
    
    class TestCase(object):
        def __init__(self):
            """
            获取当前路径下的html文件地址
            """
            self.driver = webdriver.Chrome()
            path = os.path.dirname(os.path.abspath(__file__))  # 获取当前项目路径
            file_path = 'file:///'+path+ '/test.html'
            self.driver.get(file_path)
    
        def test_checkbox(self):
            swimming = self.driver.find_element_by_name('swimming')
            reading = self.driver.find_element_by_name('reading')
            if not swimming.is_selected:  # 如果没被选中,则点击选中
                swimming.click()
            if not reading.is_selected:
                reading.click()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    9.单选框

    前端语句用radio类型

    gender:"radio" name="gender" value="male">
    "radio" name="gender" value="female">
    • 1
    • 2
        def test_radio(self):
            lst = self.driver.find_elements_by_name('gender') # 前端有多个name为gender的,用elements取出就是个列表
            lst[0].click()
    
    
    • 1
    • 2
    • 3
    • 4

    10.处理弹框

    页面上的弹框有三种:
    alert–用来提示
    confirm–用来确认
    prompt–输入内容

    方法 /属性方法/属性描述
    accept接受
    dismiss()取消
    text显示的文本
    send_keys输入内容

    前端在保存时会弹出提示,删除时要确认,撤销时要输入原因

    <a href="javascript:alert('XXX已成功)" id="alert">保存</a>
    <a href="javascript:confirm('确定要删除数据吗?)" id="confirm">删除</a>
    <a href="javascript:var why=prompt('请输入原因');document.write(why)" id="prompt">撤销</a>
    
    • 1
    • 2
    • 3
        def test_alert(self):
            self.driver.find_element_by_id('alert').click()
            alert = self.driver.switch_to.alert
            print(alert.text)
            sleep(3)
            alert.accept()
            
        def test_confirm(self):
            self.driver.find_element_by_id('confirm').click()
            confirm = self.driver.switch_to.alert
            print(confirm.text)
            confirm.accept()  # 确认
            confirm.dismiss()  # 取消
        def test_prompt(self):
            self.driver.find_element_by_id('prompt').click()
            sleep(2)
            prompt = self.driver.switch_to.alert
            prompt.accept()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    11.执行JavaScript脚本

    webDriver有两个方法来执行JavaScript:
    execute_script 同步执行
    execute_async_script 异步执行

    from selenium import webdriver
    
    class TestCase(object):
        def __init__(self):
            self.driver = webdriver.Chrome()
            self.driver.get('http://www.baidu.com')
    
        def test1(self):
            self.driver.execute_script("alert('test')")  # 执行弹窗
            self.driver.switch_to.alert.accept()  # 弹窗点击确定
    
        def test2(self):
            js = 'return document.title'  # js语句获取网页标题
            title = self.driver.execute_script(js)  # 执行js语句
            print(title)
    
        def test3(self):
            js = 'var q = document.getElementById("kw"); q.style.border="2px solid red"' # js语句定位搜索框,将搜索框变成红色
            self.driver.execute_script(js)
    
        def test4(self):
            self.driver.find_element_by_id('kw').send_keys('selenium')
            self.driver.find_element_by_id('su').click()
            js = 'window.scrollTo(0,document.body.scrollHeigh)' # 滑到底部
            self.driver.execute_script(js)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    聚类测试_31省市居民家庭消费水平
    论文翻译:2018_Source localization using deep neural networks in a shallow water environment
    [附源码]SSM计算机毕业设计医学季节性疾病筛查系统JAVA
    class12:async 和 await
    react hook:useMemo
    在C++中,`sync()`是一个用于刷新缓冲区的函数,通常用于文件或流的I/O操作。调用`sync()`函数会将所有等待写入的数据立即刷新到底层设备。
    用Unity同时开发【微信小游戏】【安卓】【IOS】游戏#6.2 WebSocket通信
    开关电源环路稳定性分析(04)-电压控制模式
    【MySQL8入门到精通】基础篇- Linux系统静默安装MySQL,跨版本升级
    协程(一)——什么是协程
  • 原文地址:https://blog.csdn.net/XGZ2IT/article/details/127879767