基于selenium+python实现自动化测试

Selenium 是一个用于自动化Web应用程序测试的工具包,它提供了一套API,允许开发者编写脚本来模拟用户与浏览器的交互。这些API可以控制浏览器执行各种操作,如导航、点击、输入文本、滚动页面等。使用Selenium结合Python进行自动化测试是一个常见的选择,因为Selenium是一个强大的工具,可以模拟用户与网页的交互。以下是实现Selenium自动化测试的基本步骤:

  1. 安装Selenium库

    使用pip安装Selenium库:

    bash 复制代码
    pip install selenium
  2. 下载WebDriver

    Selenium需要一个WebDriver来与浏览器进行交互。你需要根据你使用的浏览器下载相应的WebDriver。例如,如果你使用的是Chrome浏览器,新版本你需要下载ChromeDriver。使用的是ie浏览器的话,你需要下载iedriver. 这里需要注意一点就是chrome浏览器版本要和chromedriver版本匹配,由于在官网下载的chrome只有最新的,而chromedriver版本更新没那么快,想要下载旧版的chrome可以参考https://repo.debiancn.org/pool/main/g/google-chrome-stable/,而对应旧的chromedriver还可以看看这个https://chromedriver.storage.googleapis.com/index.html

  3. 编写测试脚本

    使用Python编写测试脚本,使用Selenium提供的API来控制浏览器。

  4. 启动WebDriver

    在脚本中,你需要实例化WebDriver,指定浏览器驱动的路径。

  5. 导航到网页

    使用WebDriver打开一个网页。

  6. 执行操作

    使用Selenium提供的API来执行各种操作,比如点击按钮、输入文本、获取页面元素等。

  7. 断言

    在自动化测试中,你需要验证页面的行为是否符合预期。

  8. 关闭浏览器

    测试完成后,关闭浏览器。

下面是一个简单的示例脚本,演示了如何使用Selenium和Python打开一个网页并获取页面标题:

python 复制代码
from selenium import webdriver

# 指定WebDriver路径
driver_path = '/path/to/chromedriver'

# 启动Chrome浏览器
driver = webdriver.Chrome(executable_path=driver_path)

# 打开网页
driver.get('http://www.example.com')

# 获取页面标题
title = driver.title
print('页面标题:', title)

# 关闭浏览器
driver.quit()

请确保替换/path/to/chromedriver为你的ChromeDriver的实际路径,以及将http://www.example.com替换为你想要测试的网页地址。其中,Selenium不仅可以用于打开网页和获取页面信息,它还可以模拟许多其他的浏览器操作。以下是一些常见的操作示例:

  1. 点击操作

    使用click()方法模拟鼠标点击。

    python 复制代码
    element = driver.find_element_by_id('some-id')
    element.click()
  2. 输入文本

    使用send_keys()方法在输入框中输入文本。

    python 复制代码
    input_field = driver.find_element_by_name('username')
    input_field.send_keys('your_username')
  3. 获取和设置Cookie

    使用get_cookies()add_cookie()方法来处理Cookie。

    python 复制代码
    cookies = driver.get_cookies()
    driver.add_cookie({'name': 'session', 'value': '123456'})
  4. 执行JavaScript

    使用execute_script()方法执行JavaScript代码。

    python 复制代码
    driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
  5. 切换窗口或框架

    使用switch_to.window()switch_to.frame()方法在不同的窗口或框架之间切换。

    python 复制代码
    driver.switch_to.window('window_name')
    driver.switch_to.frame('frame_id')
  6. 滚动页面

    使用execute_script()可以滚动到页面的特定位置。

    python 复制代码
    driver.execute_script('window.scrollTo(0, 100);')  # 滚动到页面顶部向下100像素的位置
  7. 截屏

    使用get_screenshot_as_file()方法保存当前页面的截图。

    python 复制代码
    driver.get_screenshot_as_file('screenshot.png')
  8. 等待元素加载

    使用Selenium提供的WebDriverWaitexpected_conditions来等待某个元素加载完成。

    python 复制代码
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "some-id"))
    )
  9. 执行高级用户交互

    如拖放操作,可以使用动作链(ActionChains)。

    python 复制代码
    from selenium.webdriver import ActionChains
    
    action = ActionChains(driver)
    action.click(element).perform()
  10. 获取页面源代码

    使用page_source属性获取当前页面的HTML源代码。

    python 复制代码
    page_source = driver.page_source
  11. 执行前进和后退操作

    使用back()forward()方法模拟浏览器的前进和后退。

    python 复制代码
    driver.back()
    driver.forward()

这些只是Selenium能做的一小部分事情。Selenium非常灵活,可以模拟几乎所有的浏览器操作,满足各种自动化测试的需求。最后附上一个完整的自动链接网络脚本

import argparse
import os
import subprocess
import time

import yaml
from loguru import logger
from selenium import webdriver
from selenium.webdriver.common.by import By  # 导入By类


def is_pingable(host="www.baidu.com", timeout=30):
    try:
        # 执行ping命令
        result = subprocess.run(["ping", "-c", "1", host], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,
                                timeout=timeout)

        # 检查返回的结果
        return result.returncode == 0

    except subprocess.TimeoutExpired:
        return False


def connect_network(username, password, driver_name="chrome"):
    # 启动浏览器
    if driver_name == "chrome":
        driver = webdriver.Chrome()  # 使用Chrome浏览器
    elif driver_name == "firefox":
        driver = webdriver.Firefox()  # 使用Firefox浏览器
    else:
        raise NotImplemented

    # 打开网页
    driver.get(
        "xxxx")

    # 找到用户名和密码输入框,并输入信息,这里针对网页内容按f12进入调试,选择页面对应元素的id或者name
    username_input = driver.find_element(By.NAME, "une")
    password_input = driver.find_element(By.NAME, "pass")

    username_input.send_keys(username)
    password_input.send_keys(password)

    # 找到登录按钮并点击
    login_button = driver.find_element(By.NAME, "btlogin")
    login_button.click()

    # 如果需要等待一段时间,可以使用以下语句
    driver.implicitly_wait(10)  # 等待10秒钟

    # 关闭浏览器
    driver.quit()


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Auto Connect Network')
    parser.add_argument('-c', '--config', type=str, default="config.yaml", help="config path")
    args = parser.parse_args()

    with open(args.config, 'r') as file:
        config = yaml.safe_load(file)

    username = config['username']
    password = config['password']
    interval = config['interval'] * 60
    test_mode = config['test_mode']
    driver_name = config['driver']
    ping_host = config['ping_host']

    log_name = "network.log"
    if os.path.exists(log_name):
        os.remove(log_name)
    logger.add(log_name, level="INFO")

    while True:
        if test_mode or not is_pingable(host=ping_host):
            logger.info("连接网络")
            connect_network(username, password, driver_name)
        else:
            logger.info("网络正常")
        time.sleep(interval)

其中yaml内容如下,

bash 复制代码
username: "xxx"  # 用户名
password: "xxx"  # 密码
interval: 15  # 检查间隔时间,默认15分钟
driver: chrome  # 浏览器名称,仅支持 `chrome`
ping_host: "www.baidu.com"  # 测试网站
test_mode: False  # 测试模式

其中,selenium+chrome还是有一些坑在里面的,你基于上面方法下载的chromedriver你会发现是114老版本的,基于新方法下载的里面没有chromedriver可执行文件,你运行上面脚本会一直出现找不到chromedriver,即使你配置到相关环境变量中,但是不能解决,这时候在stackoverflow上找到解决问题方法

bash 复制代码
apt-get install chromium-driver

driver = webdriver.Chrome('/usr/bin/chromedriver')

即可,如果过程中出现AttributeError: 'str' object has no attribute 'capabilities'问题,这时候可以试试将selenium的版本降低,最后我这边尝试3.14.0版本是可以的

bash 复制代码
pip install selenium==3.14.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

参考链接:

1、https://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html

2、https://github.com/SeleniumHQ/selenium

3、https://blog.csdn.net/diwii/article/details/134541429

相关推荐
yannan2019031314 分钟前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁24 分钟前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev26 分钟前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
好喜欢吃红柚子39 分钟前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python44 分钟前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯1 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
千天夜1 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
测试界的酸菜鱼1 小时前
Python 大数据展示屏实例
大数据·开发语言·python
羊小猪~~1 小时前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
放飞自我的Coder2 小时前
【python ROUGE BLEU jiaba.cut NLP常用的指标计算】
python·自然语言处理·bleu·rouge·jieba分词