Selenium web自动化测试

一、环境搭建

Selenium Client Driver — Selenium 4.36.0.202508121825 documentation

1、安装插件 selenium IDE  提供录制功能

Chrome插件下载站 - 免费下载Chrome扩展程序

2、chromedrive 浏览器驱动

手动下载并配置ChromeDriver

如果网络问题持续,或者你需要更稳定的控制,手动下载ChromeDriver是最可靠的方法。

  1. 查看Chrome浏览器版本

    • 在Chrome浏览器地址栏输入 chrome://version/,查看并记录主版本号(例如,128.0.6613.137 的主版本号是 128)。

  2. 下载匹配版本的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)。

  3. 配置使用ChromeDriver

    • 将下载的ZIP包解压,得到 chromedriver.exe 文件。

    • 在你的代码中,指定这个 chromedriver.exe 的完整路径:

二、快速入门

  1. 创建驱动器对象
  2. 发送请求,获取响应
  3. 关闭驱动器
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#userid选择器,选择id="user"的所有元素
.class.telclass选择器,选择class="tel"的所有元素
elementinput选择所有input元素
[attribute = value ][type= "password" ]选择type="password"的所有元素
element > elementp> 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自动化测试中最佳的设计模式之一。主要体现在对界面交互细节的封装,将页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,在实际测试中只需要关注业务流程,从而提高可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值