Selenium 是一个用于自动化Web应用程序测试的工具包,它提供了一套API,允许开发者编写脚本来模拟用户与浏览器的交互。这些API可以控制浏览器执行各种操作,如导航、点击、输入文本、滚动页面等。使用Selenium结合Python进行自动化测试是一个常见的选择,因为Selenium是一个强大的工具,可以模拟用户与网页的交互。以下是实现Selenium自动化测试的基本步骤:
- 安装Selenium库: 使用pip安装Selenium库:
pip 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打开一个网页并获取页面标题:
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()方法模拟鼠标点击。element = driver.find_element_by_id('some-id')element.click() - 输入文本: 使用
send_keys()方法在输入框中输入文本。input_field = driver.find_element_by_name('username')input_field.send_keys('your_username') - 获取和设置Cookie: 使用
get_cookies()和add_cookie()方法来处理Cookie。cookies = driver.get_cookies()driver.add_cookie({'name':'session','value':'123456'}) - 执行JavaScript: 使用
execute_script()方法执行JavaScript代码。driver.execute_script('window.scrollTo(0, document.body.scrollHeight);') - 切换窗口或框架: 使用
switch_to.window()或switch_to.frame()方法在不同的窗口或框架之间切换。driver.switch_to.window('window_name')driver.switch_to.frame('frame_id') - 滚动页面: 使用
execute_script()可以滚动到页面的特定位置。driver.execute_script('window.scrollTo(0, 100);')# 滚动到页面顶部向下100像素的位置 - 截屏: 使用
get_screenshot_as_file()方法保存当前页面的截图。driver.get_screenshot_as_file('screenshot.png') - 等待元素加载: 使用Selenium提供的
WebDriverWait和expected_conditions来等待某个元素加载完成。from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECelement = WebDriverWait(driver,10).until( EC.presence_of_element_located((By.ID,"some-id"))) - 执行高级用户交互: 如拖放操作,可以使用动作链(
ActionChains)。from selenium.webdriver import ActionChainsaction = ActionChains(driver)action.click(element).perform() - 获取页面源代码: 使用
page_source属性获取当前页面的HTML源代码。page_source = driver.page_source - 执行前进和后退操作: 使用
back()和forward()方法模拟浏览器的前进和后退。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内容如下,
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上找到解决问题方法
apt-getinstall chromium-driver
driver = webdriver.Chrome('/usr/bin/chromedriver')
即可,如果过程中出现AttributeError: ‘str’ object has no attribute 'capabilities’问题,这时候可以试试将selenium的版本降低,最后我这边尝试3.14.0版本是可以的
pip installselenium==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
版权归原作者 xiaomu_347 所有, 如有侵权,请联系我们删除。