一、环境搭建
Selenium Client Driver — Selenium 4.36.0.202508121825 documentation
1、安装插件 selenium IDE 提供录制功能
2、chromedrive 浏览器驱动
手动下载并配置ChromeDriver
如果网络问题持续,或者你需要更稳定的控制,手动下载ChromeDriver是最可靠的方法。
-
查看Chrome浏览器版本:
-
在Chrome浏览器地址栏输入
chrome://version/,查看并记录主版本号(例如,128.0.6613.137的主版本号是128)。
-
-
下载匹配版本的ChromeDriver:
-
国内镜像站:访问 npmmirror.com 的 ChromeDriver 镜像(例如
https://registry.npmmirror.com/binary.html?path=chrome-for-testing/),找到对应主版本的目录下载。 -
官方渠道:如果网络允许,也可以尝试Google的官方存储桶(
https://storage.googleapis.com/chrome-for-testing-public/)6 或https://googlechromelabs.github.io/chrome-for-testing/9 下载。 -
选择与你操作系统匹配的文件(如 Windows 64位选
win64目录下的chromedriver-win64.zip)。
-
-
配置使用ChromeDriver:
-
将下载的ZIP包解压,得到
chromedriver.exe文件。 -
在你的代码中,指定这个
chromedriver.exe的完整路径:
-
二、快速入门
- 创建驱动器对象
- 发送请求,获取响应
- 关闭驱动器
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 对于 Selenium 4.10.0 及以上版本,可以简化写法
service = Service('./config/chromedriver.exe') # Selenium Manager 会自动处理
driver = webdriver.Chrome(service=service)
# 或者更简单地直接(如果你的Selenium版本支持)
# driver = webdriver.Chrome()
time.sleep(2)
driver.get("https://test.topboya.com/middle/#/login")
time.sleep(10)
print(driver.title)
三、元素定位
- id & name
- css selector
- xpath
id&name
from selenium.webdriver.common.by import By
service = Service('./config/chromedriver.exe') # Selenium Manager 会自动处理
driver = webdriver.Chrome(service=service)
# 或者更简单地直接(如果你的Selenium版本支持)
# driver = webdriver.Chrome()
time.sleep(2)
driver.get("url")
time.sleep(10)
print(driver.title)
username = driver.find_element(By.id, ' ')
username.send_keys('16619848056')
password = driver.find_element(By.name, '')
css selector
-
id选择器
-
class选择器
-
元素选择器
-
属性选择器
-
层级选择器
from selenium.webdriver.common.by import By
service = Service('./config/chromedriver.exe') # Selenium Manager 会自动处理
driver = webdriver.Chrome(service=service)
# 或者更简单地直接(如果你的Selenium版本支持)
# driver = webdriver.Chrome()
time.sleep(2)
driver.get("url")
time.sleep(10)
print(driver.title)
#id选择器
username = driver.find_element(By.CSS_SELECTOR, '#user')
username.send_keys('16619848056')
#class选择器
password = driver.find_element(By.CSS_SELECTOR, '.password')
#元素选择器
driver.find_elements(By.CSS_SELECTOR, '("input")[2]'))
#属性选择器
email = driver.find_element(By.CSS_SELECTOR,'[type="email"]')
#层级选择器 (选择所有父元素为p元素的input元素)
user = driver.find_element(By.CSS_SELECTOR,'p>input')
| 选择器 | 例子 | 描述 |
| #id | #user | id选择器,选择id="user"的所有元素 |
| .class | .tel | class选择器,选择class="tel"的所有元素 |
| element | input | 选择所有input元素 |
| [attribute = value ] | [type= "password" ] | 选择type="password"的所有元素 |
| element > element | p> input | 选择所有父元素为p元素的input元素 |
xpath
1、什么是xpath
XPath即为XML Path 的简称,它是一种用来确定XML/HTML文档中某部分位置的语言。
HTML可以看做是XML的一种实现,所以Selenium用户可以使用这种强大的语言在Web应用中定位元素。xml: 一种标记语言,用于数据的存储和传递.后缀以.xml结尾
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# 对于 Selenium 4.10.0 及以上版本,可以简化写法
service = Service('./config/chromedriver.exe') # Selenium Manager 会自动处理
driver = webdriver.Chrome(service=service)
# 或者更简单地直接(如果你的Selenium版本支持)
# driver = webdriver.Chrome()
time.sleep(2)
driver.get("url")
time.sleep(10)
print(driver.title)
username = driver.find_element(By.XPATH, '//*[@id="pane-first"]/div/form/div[1]/div/div/input')
四、元素操作方法和webdriver操作方法
1、元素常用方法
- clear()
- send_keys()
- click () 单击元素
2、webdriver操作浏览器常用方法
- maximize_window() 最大化 --> 模拟浏览器最大化按钮
- set_window_size(100,100) 浏览器大小 --> 设置浏览器宽、高(像素点)
- set_window_position(300,200) 浏览器位置 --> 设置浏览器位置
- back() 后退 --> 模拟浏览器后退按钮
- forward() 前进 --> 模拟浏览器前进按钮
- refresh() 刷新 --> 模拟浏览器F5刷新
- close() 关闭 --> 模拟浏览器关闭按钮(关闭单个窗口)
- quit() 关闭 --> 关闭所有WebDriver启动的窗口
3、截图
driver.save_screenshot(str(file_path)) 截图的文件保存的路径和明子
import time
from datetime import datetime
from selenium.webdriver.common.by import By
from Linkerui.pages.base_page import BasePage
class LoginPage(BasePage):
USERNAME = (By.XPATH, '//*[@id="pane-first"]/div/form/div[1]/div/div/input')
PASSWORD = (By.CSS_SELECTOR, '[type="password"]')
LOGIN_BTN = (By.CSS_SELECTOR,'.login_box_btn')
SCREEN_DIR = './'
def login(self, username, password):
self.send_keys(self.USERNAME, username)
time.sleep(2)
now = datetime.now().strftime("%Y%m%d_%H%M%S")
file_name = f"{now}.png"
file_path = self.SCREEN_DIR + file_name
self.driver.save_screenshot(str(file_path))
self.send_keys(self.PASSWORD, password)
time.sleep(2)
self.click(self.LOGIN_BTN)
print(self.click(self.LOGIN_BTN))
time.sleep(9)
print('wancheng')
五、元素等待
-
隐式等待
-
显试等待
-
强制等待
隐式等待(掌握)
等待元素加载指定的时长,超出抛出NoSuchElementException异常,实际工作中,一般都使用隐式等待
显式与隐式区别:
- 作用域:显式等待为单个元素有效,隐式为全局元素
- 方法:显式等待方法封装在WebDriverWait类中,而隐式等待则直接通过浏览器实例化对象调用
from selenium import webdriver
from time import sleep
#1.创建webdriver
driver=webdriver.Chrome('chromedriver')
#2.加载页面
url='绝对路径\\register.html'
driver.get(url)
#隐式等待
driver.implicitly_wait(5)
显试等待
代码中定义等待条件。触发该条件后在执行后续代码。否则继续等待。直到超过设置的时间
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
# from common.logger import logger
# from common.screenshot import take_screenshot
class BasePage:
def __init__(self, driver):
self.driver = driver
#设置等待时长
self.wait = WebDriverWait(driver, 10)
def find(self, locator):
#使WebDriver等待指定元素条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)
try:
return self.wait.until(EC.presence_of_element_located(locator))
except TimeoutException:
self.driver.refresh()
time.sleep(15)
raise
def click(self, locator):
print('dianjiwancheng')
return self.find(locator).click()
def send_keys(self, locator, text):
ele = self.find(locator)
ele.clear()
ele.send_keys(text)
强制等待
time.sleep 模块
import time
from selenium.webdriver.common.by import By
from Linkerui.pages.base_page import BasePage
class Baseinfo(BasePage):
BASEINFO = (By.XPATH, '//*[@id="app"]/div/div[1]/div/ul/li[2]/span')
ORGMANGER = (By.XPATH, '//*[@id="app"]/div/div[2]/div[1]/div[1]/div[2]/div/span')
ORGANIZE = (By.XPATH, '//*[@id="app"]/div/div[2]/div[1]/div[1]/div[2]/ul/li[1]/div')
ORGANIZEQUERY = (By.XPATH, '//*[@id="layOutMainId"]/div/div[1]/div/form/div[6]/div/div[1]/span')
def base_info(self):
self.click(self.BASEINFO)
print(self.click(self.BASEINFO))
time.sleep(2)
self.click(self.ORGMANGER)
time.sleep(2)
self.click(self.ORGANIZE)
time.sleep(2)
self.click(self.ORGANIZEQUERY)
time.sleep(2)
六、鼠标操作
- context_click() 右击 --> 此方法模拟鼠标右键点击效果
- double_click() 双击 --> 此方法模拟双标双击效果
- drag_and_drop() 拖动 --> 此方法模拟双标拖动效果
- move_to_element() 悬停 --> 此方法模拟鼠标悬停效果
- perform() 执行 --> 此方法用来执行以上所有鼠标方法
1.1 鼠标执行-perform()
在ActionChains类中所有提供的鼠标事件方法,在调用的时候所有的行为都存储在ActionChains类中,而perform()方法就是执行所有ActionChains中的行为
必须调用perform()方法才能执行鼠标事件
1.4 在用户名文本框上点击鼠标右键
from selenium import webdriver
from time import sleep
#1.创建webdriver
driver=webdriver.Chrome('chromedriver')
#2.加载页面
url='绝对路径\\register.html'
driver.get(url)
user = driver.find_element_by_id("user")
user.send_keys("admin")
from selenium.webdriver.common.action_chains import ActionChains
action = ActionChains(driver)
# 右击
action.context_click(user).perform()
#双击
action.double_click(user).perform()
#鼠标拖动
source = driver.find_element_by_id("div1")
target = driver.find_element_by_id("div2")
sleep(1)
action.drag_and_drop(source, target).perform()
#鼠标悬停
submit=driver.find_element_by_xpath('//*[@type="submit"]')
sleep(1)
#悬停
action.move_to_element(submit).perform()
#3.退出
sleep(5)
driver.quit()
七、 frame标签
frame是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是driver.switch_to.frame(frame_element)。接下来我们通过163邮箱模拟登陆来学习这个知识点
import time
from selenium import webdriver
driver = webdriver.Chrome('./chromedriver')
url = 'https://mail.qq.com/cgi-bin/loginpage'
driver.get(url)
time.sleep(2)
login_frame = driver.find_element_by_id('login_frame') # 根据id定位 frame元素
driver.switch_to.frame(login_frame) # 转向到该frame中
driver.find_element_by_xpath('//*[@id="u"]').send_keys('1596930226@qq.com')
time.sleep(2)
driver.find_element_by_xpath('//*[@id="p"]').send_keys('hahamimashicuode')
time.sleep(2)
driver.find_element_by_xpath('//*[@id="login_button"]').click()
time.sleep(2)
"""操作frame外边的元素需要切换出去"""
windows = driver.window_handles
driver.switch_to.window(windows[0])
input('程序暂停,回车继续')
content = driver.find_element_by_class_name('login_pictures_title').text
print(content)
input('演示结束,回车退出')
driver.quit()
八、PO模型
page object
PO模型是Page Object Model的简写,页面对象模型。 PO模型又叫PO设计模式是selenium自动化测试中最佳的设计模式之一。主要体现在对界面交互细节的封装,将页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,在实际测试中只需要关注业务流程,从而提高可维护性。

1434

被折叠的 条评论
为什么被折叠?



