Selenium 是一个用于自动化Web应用程序测试的工具包,它提供了一套API,允许开发者编写脚本来模拟用户与浏览器的交互。这些API可以控制浏览器执行各种操作,如导航、点击、输入文本、滚动页面等。使用Selenium结合Python进行自动化测试是一个常见的选择,因为Selenium是一个强大的工具,可以模拟用户与网页的交互。以下是实现Selenium自动化测试的基本步骤:
-
安装Selenium库 :
使用pip安装Selenium库:
bashpip install selenium
-
下载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
-
编写测试脚本 :
使用Python编写测试脚本,使用Selenium提供的API来控制浏览器。
-
启动WebDriver :
在脚本中,你需要实例化WebDriver,指定浏览器驱动的路径。
-
导航到网页 :
使用WebDriver打开一个网页。
-
执行操作 :
使用Selenium提供的API来执行各种操作,比如点击按钮、输入文本、获取页面元素等。
-
断言 :
在自动化测试中,你需要验证页面的行为是否符合预期。
-
关闭浏览器 :
测试完成后,关闭浏览器。
下面是一个简单的示例脚本,演示了如何使用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不仅可以用于打开网页和获取页面信息,它还可以模拟许多其他的浏览器操作。以下是一些常见的操作示例:
-
点击操作 :
使用
click()
方法模拟鼠标点击。pythonelement = driver.find_element_by_id('some-id') element.click()
-
输入文本 :
使用
send_keys()
方法在输入框中输入文本。pythoninput_field = driver.find_element_by_name('username') input_field.send_keys('your_username')
-
获取和设置Cookie :
使用
get_cookies()
和add_cookie()
方法来处理Cookie。pythoncookies = driver.get_cookies() driver.add_cookie({'name': 'session', 'value': '123456'})
-
执行JavaScript :
使用
execute_script()
方法执行JavaScript代码。pythondriver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
-
切换窗口或框架 :
使用
switch_to.window()
或switch_to.frame()
方法在不同的窗口或框架之间切换。pythondriver.switch_to.window('window_name') driver.switch_to.frame('frame_id')
-
滚动页面 :
使用
execute_script()
可以滚动到页面的特定位置。pythondriver.execute_script('window.scrollTo(0, 100);') # 滚动到页面顶部向下100像素的位置
-
截屏 :
使用
get_screenshot_as_file()
方法保存当前页面的截图。pythondriver.get_screenshot_as_file('screenshot.png')
-
等待元素加载 :
使用Selenium提供的
WebDriverWait
和expected_conditions
来等待某个元素加载完成。pythonfrom 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")) )
-
执行高级用户交互 :
如拖放操作,可以使用动作链(
ActionChains
)。pythonfrom selenium.webdriver import ActionChains action = ActionChains(driver) action.click(element).perform()
-
获取页面源代码 :
使用
page_source
属性获取当前页面的HTML源代码。pythonpage_source = driver.page_source
-
执行前进和后退操作 :
使用
back()
和forward()
方法模拟浏览器的前进和后退。pythondriver.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