web自动化框架:selenium学习使用操作大全(Python版)

Python+Selenium安装及环境配置手把手教会你 1. 1,组件✨Selenium IDE,Firefox浏览器的一个插件,提供简单的脚本录制、编辑与回放功能;Selenium Remote Control (RC),是selenium 1 提供的组件,包含:SeleniumServer(用于提供自动化测试服务)、Selenium Client(用于执行脚本);Selenium Grid,用于对测试用例集做分布式处理(并行),现已集成到selenium server中; 阅读详情
AI摘要

本文围绕Selenium自动化测试展开,介绍了浏览器驱动下载、selenium - python安装及元素操作。详细阐述网页解析(HTML、xpath),还涵盖Selenium基本操作,如元素定位、iframe切换、表单填充等,同时提及调整窗口大小、元素操作判断等内容及相关问题解决办法。

一、浏览器驱动下载

Selenium需要浏览器驱动程序才能与所选浏览器交互。例如,Firefox需要安装geckodriver。确保它在PATH中。

主流浏览器驱动下载地址如下:

浏览器驱动名称打开方式及注意事项地址
Chromechromedriverdriver = webdriver.Chrome()
下载浏览器对应版本的chromedriver.exe
一定要创建对象,不然打开会闪退!!!
https://registry.npmmirror.com/binary.html?path=chromedriver
Firefoxgeckodriverwebdriver.Firefox()
下载最新版本的geckodriver.exe
https://github.com/mozilla/geckodriver/releases
EdgeMicrosoftWebDriverdriver = webdriver.Edge()
最好在官网下载对应版本的浏览器:https://www.microsoft.com/en-us/edge,然后下载浏览器对应版本的msedgedriver.exe
一定要创建对象,不然打开会闪退!!!
windows10运行代码时:将msedgedriver.exe重命名为MicrosoftWebDriver.exe,不然运行程序会报错!!!
windows11运行代码时:msedgedriver.exe不要重命名!!!
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver
IEIEDriverServerwebdriver.Ie()
下载selenium对应版本的IEDriverServer.exe
https://registry.npmmirror.com/binary.html?path=selenium

具体,可以查看:chromedriver、geckodriver、MicrosoftWebDriver、IEDriverServer和operadriver之间的恩怨纠葛
ps:最新版chromedriver的下载地址:
https://googlechromelabs.github.io/chrome-for-testing/#stable

二、selenium-python安装(打开网站、操作元素)

1.安装

pip install -U selenium

注:-U就是指定下载最新版本的selenium
2. 控制浏览器
2.1 打开浏览器

from selenium import webdriver
# 打开浏览器
driver = webdriver.Chrome()

或者,可以指定驱动路径:

driver = webdriver.Chrome(executable_path=r'D:\Program Files\Python36\chromedriver.exe')

关闭浏览器及其对应驱动:

driver.quit()

还可以通过上下文来控制其执行操作后自动关闭:

with webdriver.Chrome(executable_path='chromedriver.exe') as driver:
    driver......

2.2 打开网站

driver.get('https://blog.youkuaiyun.com/testleaf/article/details/123269042')

延时3秒:

import time
time.sleep(3)

2.3 定位元素
传说中的八大元素定位方法:

driver.find_element_by_id()                 # 通过id属性定位(唯一);常用
driver.find_element_by_xpath()              # 通过xpath表达式定位;常用
driver.find_element_by_class_name()         # 通过类名定位;常用
driver.find_element_by_name()               # 通过name属性定位
driver.find_element_by_tag_name()           # 通过标签名定位
driver.find_element_by_css_selector()       # 通过css选择器定位
driver.find_element_by_link_text()          # 通过链接标签的text类容定位
driver.find_element_by_partial_link_text()  # 通过匹配链接标签的text类容定位

上面的都是找到第一个元素,每一个方法都有对应多个元素的方法:
如:driver.find_elements_by_id()

示例1:
driver.find_element_by_id(“toolbar-search-input”)
在这里插入图片描述
示例2:
driver.find_element_by_name(“wd”)
在这里插入图片描述
2.4 操作元素

# 定位搜索框
element = driver.find_element_by_id("toolbar-search-input")
# 输入搜索内容
element.send_keys('web自动化框架:selenium入门')
# 定位搜索按钮
search_button = driver.find_element_by_id('toolbar-search-button')
# 点击搜索按钮
search_button.click()

三、网页解析(HTML、xpath)

1.HTML
HTML【Hyper Text Markup Language】:超文本标记语言,不是编程语言,用来描述网页的。也称为:网页的源码、html源码、html文档、document。
具体,可以查看:
网页的源码,html源码,html文档,document
HTML常用标签
HTML示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #table {
            border: 1px solid
        }

        .th {
            font-size: 20px
        }
    </style>
</head>
<body>
<div>我是一个div标签</div>
<h1>我是一个大<span style="color:red">标签</span></h1>
<p></p>
<a href="https://blog.youkuaiyun.com/testleaf">testleaf</a>
<table id="table">
    <thead>
    <tr>
        <th class="th aaa">字段1</th>
        <th class="th">字段2</th>
        <th class="th">字段3</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>1</td>
        <td>2</td>
        <td>3</td>
    </tr>
    </tbody>
</table>
<form action="">
    <p>用户名: <input type="text"></p>
    <p>密码:<input type="password"></p>
    <p><input type="submit"></p>
</form>
</body>
</html>

2.xpath
xpath:一个解析html/xml的语言。

  • 语法
    • 选取节点
      • nodename 选取此节点的所有子节点
      • / 从根节点选取
      • // 从匹配选择的当前节点选择文档中的节点,不考虑它们的位置
      • . 选取当前节点
      • … 表示选取当前节点的父节点,如://div[@class="active"]/..
      • @ 选取属性
      • 案例
        • //div 获取文档中的所有的div
    • 谓语 用来查找特定的节点,或者包含指定值的节点
      • 谓语被包裹在中括号中
      • //div[@class="active"]
      • //div[@class="active" and @id="kw"]
      • //div[@class="active" or @id="kw"]
      • //div[@class="active"]/span[last()]
    • 轴 用来查找相对于当前节点的节点
    • 函数
      • text() 元素的text内容
        • //li[text()="强烈推荐"]
      • contains(@属性名/text(), value)包含的内容
        • //li[contains(@class, "ls")]

在浏览器中进行验证:

$x('//div')

在这里插入图片描述

四、selenium基本操作

Pycharm-Terminal操作:

IPYTHON
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.quit()
exit()

在这里插入图片描述
浏览器-Console操作:

window.scrollTo(0,100)

在这里插入图片描述

1、元素定位八种方法

传说中的八大元素定位方法:

driver.find_element_by_id()                 # 通过id属性定位(唯一);常用
driver.find_element_by_xpath()              # 通过xpath表达式定位;常用
driver.find_element_by_class_name()         # 通过类名定位;常用
driver.find_element_by_name()               # 通过name属性定位
driver.find_element_by_tag_name()           # 通过标签名定位
driver.find_element_by_css_selector()       # 通过css选择器定位
driver.find_element_by_link_text()          # 通过链接标签的text类容定位
driver.find_element_by_partial_link_text()  # 通过匹配链接标签的text类容定位

以上方法只会返回匹配到的第一个元素;
返回的是 selenium.webdriver.remote.webelement.WebElement的对象;
返回多个元素在element后加s即可,例如:driver.find_elements_by_xpath(),使用时要小心;
凡是elements的方法返回的是列表;

from selenium import webdriver

driver = webdriver.Chrome()

# 打开百度页面
driver.get('https://www.baidu.com')

# 1. 获取搜索框
search_input = driver.find_element_by_id('kw')
print(type(search_input))
print('1.搜索框的name属性值=', search_input.get_attribute('name'))

# 2. 搜索按钮
search_btn = driver.find_element_by_xpath('//input[@value="百度一下"]')
print('2.搜索按钮的id=', search_btn.get_attribute('id'))

# 3. 百度logo
logo = driver.find_element_by_class_name('index-logo-src')
print('3.百度logo的src=', logo.get_attribute('src'))

# 4. 通过name属性定位搜索框
search_input_by_name = driver.find_element_by_name('wd')
print('4.搜索框的id=', search_input_by_name.get_attribute('id'))

# 5. 热搜榜中的链接
hot_ul = driver.find_element_by_xpath('//ul[@id="hotsearch-content-wrapper"]')
# hot_ul = driver.find_element_by_xpath('//ul[@text()="热榜"]')
hot_a_s = hot_ul.find_element_by_tag_name('a')
print('5.热搜榜第一的标题是:', hot_a_s.text)

# 6. 通过css选择器定位搜索框
search_input_by_css = driver.find_element_by_css_selector('#kw')
print('6.搜索框的name=', search_input_by_css.get_attribute('name'))

# 7. 新闻栏目
el_a = driver.find_element_by_link_text('新闻')
print('7.新闻栏目的url=', el_a.get_attribute('href'))

# 8. 通过部分text匹配新闻栏目
el_a1 = driver.find_element_by_partial_link_text('新')
print('8.新闻栏目的url=', el_a1.get_attribute('href'))

driver.quit()

2、元素动态定位

问题:元素的定位方式不确定,可能是id,可能是xpath,需要通过不同的方式动态指定定位方法;
办法:加判断语句,不需要我们写,selenium底层定位就是这么做的;

driver.find_element(by,value)
driver.find_elements(by,value)

by: 定位方式
value: 定位表达式

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

# 打开百度页面
driver.get('https://www.baidu.com')

id_loc = 'kw'
xpath_loc = '//input[@id="kw"]'

e1 = driver.find_element(By.ID, id_loc)
# send_keys往输入框输入文本
e1.send_keys('我通过id定位')
time.sleep(3)

# e2 = driver.find_element(By.XPATH, xpath_loc)
e2 = driver.find_element('xpath', xpath_loc)
e2.clear()  # 清空原有内容
e2.send_keys('我通过xpath定位')

time.sleep(3)
driver.quit()

3、iframe切换

当页面中包含iframe时,不能直接操作iframe中的元素,需要先切换进iframe才行;
selenium通过driver.switch_to.frame(frame_reference)来切换;
selenium切换iframe有三种方式:

  • 1.通过webelement:
    • 使用webelement进行切换是最灵活的选择,先定位到iframe然后切换到它;
  • 2.通过name或id:
    • iframe一般都会有id或name属性,则可以使用该属性进行切换,如果name或id在页面上不唯一,name将切换到找到的第一个;
  • 3.通过iframe在页面中的索引进行切换(从0开始):
    • 在浏览器console调试工具中使用window.ampInaboxIframes可以查询当前页面中的iframe;退出iframe:driver.switch_to.default_content();
import time
from selenium import webdriver

# 使用with语句进行上下文管理
# 异常时也会关闭浏览器驱动
with webdriver.Chrome() as driver:
    driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_form_radio')
    # 切换iframe
    # 1. webelement的方式
    # 先获取到iframe
    iframe = driver.find_element_by_id('iframeResult')
    # 再切换到
    driver.switch_to.frame(iframe)

    # 2. name/id的方式
    # 直接通过name/id切换
    driver.switch_to.frame('iframeResult')

    # 3. 使用索引
    # 切换到第二个iframe
    time.sleep(1)
    driver.switch_to.frame(1)
    # 找到female单选框
    female = driver.find_element_by_xpath('//input[@value="female"]')

    print(female)
    # 4. 离开iframe,回到主页面
    driver.switch_to.default_content()
    driver.find_element_by_xpath('//a[text()="运行代码"]')

4、填充表单_填充文本框

import time
from selenium import webdriver

with webdriver.Chrome() as driver:
    driver.get('https://www.baidu.com')

    # 搜索框定位
    search_input = driver.find_element_by_id('kw')
    # element.send_keys(string)输入文本
    # 所有可输入的标签都适用
    search_input.send_keys('软件测试')

    # 搜索按钮定位
    search_btn = driver.find_element_by_xpath('//input[@value="百度一下"]')
    # 点击
    # element.click()点击
    search_btn.click()
    time.sleep(3)

5、填充表单_单选按钮

import time
from selenium import webdriver
with webdriver.Chrome() as driver:
    driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_form_radio')
    # 切换iframe
    iframe = driver.find_element_by_id('iframeResult')
    driver.switch_to.frame(iframe)
    # 找到female单选框
    female = driver.find_element_by_xpath('//input[@value="female"]')
    # 在元素上点击
    female.click()  # 选中
    time.sleep(5)

6、填充表单_下拉列表

下拉框有两种处理方法:
(1)直接定位到要选中的option选项,然后点击
(2)通过selenium.webdriver.support.ui.Select类

import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select

with webdriver.Chrome() as driver:
    driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_elements_select')
    # 切换iframe
    iframe = driver.find_element_by_id('iframeResult')
    driver.switch_to.frame(iframe)
    # 找到audi选项
    # 1. 通过option直接操作
    option = driver.find_element_by_xpath('//option[@value="audi"]')
    option.click()
    time.sleep(1)
    # 2. 通过select类
    # 找到select
    select = Select(driver.find_element_by_xpath('//select[@name="cars"]'))
    #
    # # 选中索引为1的选项,索引从0开始
    select.select_by_index(1)
    time.sleep(1)
    #
    # # 选中value等于audi的选项
    select.select_by_value('audi')
    time.sleep(1)
    #
    # # 选中option的文本为Volvo的选项
    select.select_by_visible_text('Volvo')
    time.sleep(3)

7、切换窗口和标签页

webdriver 不区分窗口和标签页。打开一个新的标签页或者窗口,selenium会使用窗口句柄来处理它。
每个窗口都有一个唯一的标识符,该标识符在单个会话中保持持久性。
(1)获取当前窗口句柄:driver.current_window_handle;
(2)切换窗口或标签页:通过循环遍历的方式来切换;

import time
from selenium import webdriver
with webdriver.Chrome() as driver:
    driver.get('https://www.baidu.com')
    # 找到搜索框
    search_input = driver.find_element_by_id('kw')
    search_input.send_keys('图片')
    # 点击搜索按钮
    driver.find_element_by_id('su').click()
    time.sleep(1)
    # 获取原窗口的handle
    original_window = driver.current_window_handle
    print('当前窗口句柄', original_window)
    print('窗口的title', driver.title)

    # 选取第一个结果并点击
    driver.find_element_by_xpath('//div[@id="3001"]//a').click()
    # time.sleep(1)
    for handle in driver.window_handles:
        if handle != original_window:
            # 切换到新窗口
            driver.switch_to.window(handle)
            break
    # 打印当前窗口句柄
    print('新打开的搜索页面句柄', driver.current_window_handle)
    print('新打开的页面的title', driver.title)
    time.sleep(5)

8、显式等待

浏览器渲染页面的时候需要时间,如果没有渲染完成就对元素进行定位将会找不到到该元素;
所以需要加延时进行等待,有三种等待方式:
(1)time.sleep()
前面已经反复使用了;等待时间固定,不稳定;等待时间多半不确定;

(2)显式等待
显式等待就是在元素操作前循环判断操作的条件是否满足,满足后再操作;
selenium通过selenium.webdriver.support.ui.WebDriverWait类的对象来实现显式等待;webDriverWait类实例化时可以接收3个参数:

  • driver: webdriver对象
  • timeout:超时时间,最多等待多少秒
  • poll_frequency: 检查频率,默认0.5秒

until方法接受1个参数:

  • conditions:条件在selenium.webdriver.support.expected_conditions 模块中;
    常见条件:
    presence_of_element_located:元素存在于dom中
    visibility_of_element_located:元素可见
    element_to_be_clickable:元素可点击
    element_to_be_selected:元素可选择

实例化条件需要传入一个定位参数,是一个二元元组:(by, loc_expression)

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import selenium.webdriver.support.expected_conditions as EC


with webdriver.Chrome() as driver:
    driver.get('https://www.baidu.com')
    # 找到搜索框
    search_input = driver.find_element_by_id('kw')
    search_input.send_keys('图片')
    # 点击搜索按钮
    driver.find_element_by_id('su').click()
    # 获取原窗口的id
    original_window = driver.current_window_handle
    print('当前窗口句柄', original_window)
    print('窗口的title', driver.title)

    # 选取第一个结果并点击
    #
    # WebDriverWait(driver, timeout=3).until(
    #     EC.visibility_of_element_located((By.XPATH, '//div[@id="3001"]//a'))
    # ).click()
    s_time = time.time()
    btn = WebDriverWait(driver, timeout=3).until(
        EC.visibility_of_element_located((By.ID, '3001'))
    )
    btn.click()
    e_time = time.time()
    print(e_time-s_time)
    # WebDriverWait(driver, timeout=3).until(
    #     EC.visibility_of_element_located(('id', '3001'))
    # ).click()
    # 会等待id为3001的元素可见,timeout=3表示最多等待3秒钟,超时就抛出异常
    # driver.find_element_by_xpath('//div[@id="3001"]//a').click()
    # time.sleep(1)
    for handle in driver.window_handles:
        if handle != original_window:
            # 切换到新窗口
            driver.switch_to.window(handle)
            break
    # 打印当前窗口句柄
    print('新打开的搜索页面句柄', driver.current_window_handle)
    print('新打开的页面的title', driver.title)
    time.sleep(5)

9、隐式等待

(3)隐式等待
隐式等待本质上是设置了一个全局等待时间,WebDriver在试图查找任何元素时都会轮询一定时间,默认情况下隐式等待是禁用的。
警告:不要混用隐式等待和显示等待,这样会导致不可预测的等待时间。
例如:隐式等待设置10秒,显式等待设置15秒,可能导致在20秒后发生超时;
隐式等待是告诉WebDriver如果在查找一个或多个不是立即可用的元素时轮询DOM一段时间。默认设置为0,表示禁用。一旦设置好,隐式等待就会被设置为会话的生命周期。

import time
from selenium import webdriver

with webdriver.Chrome() as driver:
    # 设置隐式等待5秒
    driver.implicitly_wait(5)
    driver.get('https://www.baidu.com')
    # 找到搜索框
    search_input = driver.find_element_by_id('kw')
    search_input.send_keys('图片')
    # 点击搜索按钮
    driver.find_element_by_id('su').click()
    # 获取原窗口的id
    original_window = driver.current_window_handle
    print('当前窗口句柄', original_window)
    print('窗口的title', driver.title)

    # 选取第一个结果并点击
    driver.find_element_by_xpath('//div[@id="3001"]//a').click()

    for handle in driver.window_handles:
        if handle != original_window:
            # 切换到新窗口
            driver.switch_to.window(handle)
            break
    # 打印当前窗口句柄
    print('新打开的搜索页面句柄', driver.current_window_handle)
    print('新打开的页面的title', driver.title)
    time.sleep(5)

10、警告框

WebDriver提供了一个API,用于处理JavaScript提供的三种类型的原生弹窗消息
(1)Alerts警告框

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

with webdriver.Chrome() as driver:
    driver.get('https://www.w3school.com.cn/tiy/t.asp?f=js_alert')
    driver.switch_to.frame('iframeResult')

    button = WebDriverWait(driver, timeout=3).until(
        EC.visibility_of_element_located(('xpath', '//button')))
    # 有时候需要结合sleep来处理
    # time.sleep(1)
    button.click()
    # time.sleep(3)
    # 等待alert弹出

    alert = WebDriverWait(driver, timeout=3).until(EC.alert_is_present())
    # time.sleep(1)
    # alert = driver.switch_to.alert
    # 获取弹出框文本
    text = alert.text
    print(text)
    time.sleep(1)
    # # 确认
    alert.accept()
    time.sleep(1)

11、confirm确认框

(2) confirm确认框
与警告框不同,确认框还有取消按钮;

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


with webdriver.Chrome() as driver:
    driver.get('https://www.w3school.com.cn/tiy/t.asp?f=js_confirm')
    driver.switch_to.frame('iframeResult')

    button = WebDriverWait(driver, timeout=3).until(
        EC.visibility_of_element_located(('xpath', '//button')))

    button.click()
    # # 等待confirm弹出
    WebDriverWait(driver, timeout=3).until(EC.alert_is_present())
    #
    # # 获取alert
    alert = driver.switch_to.alert
    #
    # # 获取弹出框文本
    text = alert.text
    print(text)
    time.sleep(2)
    # # 取消
    # 点击取消后 当前的alert对象就会被销毁
    alert.dismiss()
	# alert.accept() 确认
    time.sleep(2)

12、prompt提示框

(3)prompt提示框
还可以输入文本;

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
with webdriver.Chrome() as driver:
    driver.get('https://www.w3school.com.cn/tiy/t.asp?f=js_prompt')
    driver.switch_to.frame('iframeResult')

    button = WebDriverWait(driver, timeout=3).until(
        EC.visibility_of_element_located(('xpath', '//button')))
    # 避免js没有绑定出现意外问题,加一秒延时
    time.sleep(1)
    button.click()

    # 等待alert弹出
    WebDriverWait(driver, timeout=3).until(EC.alert_is_present())

    # 获取alert
    alert = driver.switch_to.alert

    # 输入信息
    alert.send_keys('testleaf')
    time.sleep(3)
    # 确认
    alert.accept()
    # alert.dismiss() 取消
    time.sleep(3)

13、鼠标操作动作链

鼠标是通过使用底层接口执行的,需要调用ActionChains对象来执行对应的方法。
(1)clickAndHold:它将移动到该元素,然后在给定元素的中间单击(不释放);
(2)contextClick:此方法首先将鼠标移动到元素的位置, 然后在给定元素执行上下文点击(右键单击);
(3)doubleClick:它将移动到该元素, 并在给定元素的中间双击;
(4)moveToElement:此方法将鼠标移到元素的中间. 执行此操作时, 该元素也会滚动到视图中;
(5)moveByOffset:此方法将鼠标从其当前位置(或0,0)移动给定的偏移量. 如果坐标在视图窗口之外, 则鼠标最终将在浏览器窗口之外;
(6)dragAndDrop:此方法首先在源元素上单击并按住,然后移动到目标元素的位置后释放鼠标;
(7)release:此操作将释放按下的鼠标左键. 如果WebElement转移了, 它将释放给定WebElement上按下的鼠标左键;

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

with webdriver.Chrome() as driver:
    driver.get(r'file://D:\project\action.html')

    div = WebDriverWait(driver, timeout=3).until(EC.visibility_of_element_located(('xpath', '//div[@οnmοuseοver="mOver(this)"]')))
    # 移动到指定元素 move_to_element
    webdriver.ActionChains(driver).move_to_element(div).perform()
    time.sleep(2)
    # 移开多大位置x,y move_by_offset
    webdriver.ActionChains(driver).move_by_offset(xoffset=500, yoffset=500).perform()
    time.sleep(2)
    # 点住不放 click_and_hold
    div = driver.find_element_by_xpath('//div[@οnmοusedοwn="mDown(this)"]')
    webdriver.ActionChains(driver).click_and_hold(div).perform()
    time.sleep(2)
    # 松开鼠标 release
    webdriver.ActionChains(driver).release(div).perform()
    time.sleep(2)
    # double_click 双击
    button = driver.find_element_by_xpath('//button[@ondblclick]')
    webdriver.ActionChains(driver).double_click(button).perform()
    time.sleep(2)
    # drag 将div1拖拽到div2上
    div1 = driver.find_element_by_id('draggable')
    div2 = driver.find_element_by_id('droppable')
    webdriver.ActionChains(driver).drag_and_drop(div1, div2).perform()
    time.sleep(3)
    # contextClick 点击鼠标右键
    div = driver.find_element_by_xpath('//div[@οnmοusedοwn="whichButton(event)"]')
    webdriver.ActionChains(driver).context_click(div).perform()
    time.sleep(2)

14、执行js代码_滚动1

selenium执行js有几个方法,这里我们使用最常用的方法execute_script;

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

with webdriver.Chrome() as driver:
    driver.get('https://image.baidu.com')
    search_input = WebDriverWait(driver, 3).until(EC.visibility_of_element_located(('id', 'kw')))
    search_input.send_keys('软件测试')
    WebDriverWait(driver, 3).until(EC.element_to_be_clickable(('xpath', '//input[@value="百度一下"]'))).click()
    time.sleep(3)
    # 滚动到(0px,100px)的位置
    driver.execute_script("window.scrollTo(0,100)")
    time.sleep(1)
    driver.execute_script("window.scrollTo(0,200)")
    time.sleep(1)
    driver.execute_script("window.scrollTo(0,300)")
    time.sleep(3)
    # 移动到底部
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    time.sleep(3)
    # 移动到顶部
    driver.execute_script("window.scrollTo(0,0)")
    time.sleep(3)

15、执行js代码_滚动2

selenium执行js有几个方法,这里我们使用最常用的方法execute_script;
执行js时,还可以传递参数给js脚本;
下面的案例:
打开页面,并滚动到指定的元素可见为止;
下面的代码 div 被传递给了arguments,通过切片的方式可以取出;

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

with webdriver.Chrome() as driver:
    driver.get(r'file://D:\project\scroll.html')
    time.sleep(2)
    div = driver.find_element_by_xpath('//div')
    # 移动到元素的底端与当前窗口的底部对齐
    driver.execute_script("arguments[0].scrollIntoView(false);", div)
    time.sleep(2)
    # 移动到元素的顶端与当前窗口的顶端对齐
    driver.execute_script("arguments[0].scrollIntoView();", div)
    time.sleep(2)

16、上传操作_input上传

selenium只支持input元素的上传,直接使用send_keys将文件绝对地址写入元素即可;

import time
from selenium import webdriver

with webdriver.Chrome() as driver:
    driver.get('https://www.baidu.com')
    span = driver.find_element_by_xpath('//span[@class="soutu-btn"]')
    span.click()
    time.sleep(1)
    input = driver.find_element_by_xpath('//input[@class="upload-pic"]')

    input.send_keys(r'D:\project\find.jpg')

    # 有可能还需要提交的操作,百度是不需要
    time.sleep(10)

17、上传操作_非input上传_pywinauto

很多时候页面不是使用input来进行文件上传,这是就需要通过其他第三方包来操作系统界面;
(1)pywinauto
缺点: 只能在windwows上使用;
优点:可以选择多个文件,路径中有中文也可以;

import time

from selenium import webdriver
from pywinauto.keyboard import send_keys

with webdriver.Chrome() as driver:
    driver.get('https://www.baidu.com')
    span = driver.find_element_by_xpath('//span[@class="soutu-btn"]')
    span.click()
    time.sleep(1)
    # select_span = driver.find_element_by_xpath('//span[text()="选择文件"]')
    select_span = driver.find_element_by_xpath('//div[@class="upload-wrap"]')
    # 点击打开选择文件窗口
    select_span.click()

    time.sleep(3)
    # 选择文件
    send_keys(r'D:\project\find.jpg')
    time.sleep(1)
    # # 选择确定
    send_keys('{ENTER}')
    time.sleep(10)

18、上传操作_非input上传_pyautogui

很多时候页面不是使用input来进行文件上传,这里就需要通过其他第三方包来操作系统界面;
(2)pyautogui
缺点: 只能选择一个文件,文件路径有中文会出问题;
优点:跨平台(windows,mac,linux);

import time

from selenium import webdriver
import pyautogui

with webdriver.Chrome() as driver:
    driver.get('https://www.baidu.com')
    span = driver.find_element_by_xpath('//span[@class="soutu-btn"]')
    span.click()
    time.sleep(1)
    # select_span = driver.find_element_by_xpath('//span[text()="选择文件"]')
    select_span = driver.find_element_by_xpath('//div[@class="upload-wrap"]')
    # 点击打开选择文件窗口
    select_span.click()

    time.sleep(3)
    # 选择文件
    pyautogui.write(r"D:\project\find.jpg")
    time.sleep(1)
    # 选择确定
    pyautogui.press('enter', 2)
    time.sleep(10)

五、selenium调整窗口大小

selenium调整窗口到指定大小:

driver.set_window_size(900,1000)

浏览器最大化:

driver.maximize_window() 

六、判断元素是否允许被操作

driver.find_element_by_name("XXX").is_enabled() # 是否可以编辑,或者按钮是否可以点击
 
driver.find_element_by_name("XXX").is_displayed() # 判断元素是否显示
 
element=driver.find_element_by_name("XXX").is_selected() # 判断元素是否选中状态

七、获取某个元素的html

driver.find_element_by_id('XXX').get_attribute('innerHTML')

八、其他问题

1、svg定位

问题描述:
使用xpath方法对svg下元素进行定位,会发现无法定位到svg下的元素:

driver.find_element(xpath,"/html/body/div[19]/svg")

解决方法1【错误】:
从svg元素开始,下面的元素都要以*[name()=‘svg element’] 这种形式进行编写

driver.find_element(xpath,"/html/body/div[19]/*[name()='svg']/*[name()='path']")

会发现仍然定位不到;
解决办法2【正确】:
绝对路径的话,*[name()='svg']前面得加双斜杠,不然定位不到:

driver.find_element(xpath,"/html/body/div[19]//*[name()='svg']")

相对路径的话,*[name()='svg']前就不用加双斜杠,只用单斜杠:

driver.find_element(xpath,"//*[@id='userinfo']/*[name()='svg']/*[name()='use']")

2、处理chrome显示通知弹框

使用chrome打开weibo.com会出现以下界面的弹出框:
在这里插入图片描述

这东西不属于页面alert弹框,而是属于浏览器的设置项。

要关掉它,需要对浏览器进行属于配置。具体见下面脚本:

from selenium import webdriver

options = webdriver.ChromeOptions()
prefs = {
    'profile.default_content_setting_values':{
        'notifications':2
    }
}
options.add_experimental_option('prefs',prefs)
driver = webdriver.Chrome(options = options)
driver.get("https://blog.youkuaiyun.com/testleaf/article/details/123269042")

3、获取元素的文本

①element.text
②get_attribute(“textContent”)
优点:可以获取隐藏元素的文本
缺点:IE不支持;获取有些元素的文本时,结果中带有空字符串;(没有尝试过)
③get_attribute("innerText")
优点:可以获取隐藏元素的文本
缺点:FireFox不支持;(每个博客能搜到的都说这个缺点,但实际操作发现可以获取到每次所需的文本)

4、切换网址

直接进行切换就可以了,如下:

driver.get('https://blog.youkuaiyun.com/testleaf/article/details/123269042')
time.sleep(2)
driver.get('https://blog.youkuaiyun.com/testleaf/article/details/123302863')

5、find_element_by_xpath()被弃用解决方案

from selenium.webdriver.common.by import By
from selenium import webdriver
driver = webdriver.Chrome() #启动chromedriver
driver.get('http://www.baidu.com') #打开http://www.baidu.com
driver.find_element(By.XPATH,'//div[@class="detail-item-ctn"][1]').click() #点击按钮

免责声明:
1.编写此文是为了更好地学习selenium的使用,如果损害了有关人的利益,请联系删除;
2.如果文中描述欠妥,请在评论中进行指正;
3.文字编写不易,若感觉有用,点赞收藏关注会让博主很开心哦;
4.此外,本文支持任何形式的转载,转载请注明出处,非常感谢!!!
本文源自:https://blog.youkuaiyun.com/testleaf/article/details/123269042

小白爬虫——selenium入门超详细教程 Selenium是一个用于自动化测试的工具,它可以模拟用户在浏览器中的各种操作。除了用于爬虫,Selenium还可以用于测试,尤其是在处理动态加载页面时非常有用。本文将提供一个超级详细的Selenium教程,以帮助您快速入门并了解其各种功能和用法。本博客为自学python爬虫的过程贴,内容上可能存在些许错误,希望大家批评指正,后续我将努力完善修改,散花! 阅读详情

相关推荐

Phython新手做网页操作自动化

做一个工具,需要将excel内的内容分别对应填充到网页内的表单文本框和下拉框中

jiangyi_szws的博客 6610

Python爬虫之Selenium库的使用

Selenium是一个自动化测试工具,支持各种浏览器,包括Chrome、Firefox等主流浏览器。使用它就可以模拟浏览器进行各种操作,包括用它来爬取一些内容。当你看到浏览器自己运行并且在网页上翻页或者跳转的时候,应该会觉得很有趣。 Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾经是 Seleni...

Steven的博客 3万+

基于Selenium+Python的web自动化测试框架详解

Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid。Selenium IDE:Firefox的一个扩展,它可以进行录制回放,并把录制的操作以多种语言(例如java、python等)的形式导出成测试用例。Selenium WebDriver:提供Web自动化所需的API,主要用作浏览器控制、页面元素选择和调试。

manbskjabgkb的博客 2134

Python——Selenium快速上手+方法(一站式解决问题)

Selenium是一个用于自动化Web应用程序测试的工具,它提供了一组API,允许用户以编程方式控制浏览器行为。通过Selenium,用户可以模拟用户在浏览器中的操作,如点击按钮、填写表单、导航等,从而进行自动化测试或执行网页操作。 Python安装Selenium需要进行以下步骤: 使用pip安装Selenium第三方库:pip install selenium 下载并配置浏览器驱动,例如Chrome浏览器需要下载ChromeDriver,并确保驱动文件与浏览器版本匹配。

Pan_peter的博客 2万+

linux下使用Ollama本地部署LLM

Ollama 是一个用于在本地运行大语言模型(如 Llama 2、Mistral、Gemma、Qwen 等)的工具,支持模型的拉取、运行、管理等功能。当你运行ollama。

u013218342的博客 1659

iPhone用户必看:TrollStore巨魔商店在线安装保姆级教程(iOS 14-16.6.1适用)

本文为iOS 14至16.6.1系统的iPhone用户提供了一份详细的TrollStore(巨魔商店)在线安装教程。文章从核心原理、安装前准备讲起,逐步详解了通过Safari浏览器获取安装器、信任企业证书、部署TrollStore及关键后置配置的全过程,并附带了常见问题排错指南,帮助用户安全、高效地实现无需越狱安装第三方应用。

h0i1j2k3l的博客 1974

基于Selenium的web自动化框架

1 什么是selenium Selenium 是一个基于浏览器的自动化工具,它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid: Selenium IDE:Firefox的一个扩展,它可以进行录制回放,并可以把录制的操作以多种语言(例如java,p...

dasaisao0725的博客 3259

ZYNQ microblaze boot.bin固化步骤

一,ZYNQ移植软核的原理FPGA规模巨大而且功能复杂,因此设计的每一个部分都从头开始是不切实际的。一种解决的办法是:对于较为通用的部分可以重用现有的功能模块,而把主要的时间和资源用在设计中的那些全新的、独特的部分。这就像是你在开发应用程序的时候就不用直接去写驱动物理硬件的代码,而是直接调用Windows提供的API就行了。

wangjie36的博客 2780

【自动化测试】基于Selenium + Python的web自动化框架

基于Selenium实现的web自动化框架不仅轻量级而且灵活,可以快速的开发自动化测试用例,结合本篇的框架设计和一些好的实践,希望对大家以后的web自动化框架的设计和实现有所帮助。

kk_lzvvkpj的博客 1028

AutoSAR配置视频讲解:新建DaVinci工程

AutoSAR实验视频讲解:闪烁一颗LED实验【新建DaVinci工程】 上一篇 | 下一篇 | 总目录 实验架构图 视频本频放在了文末,下图描述了本次实验配置内容在AutoSAR架构中的位置,供大家参考 实验内容 本节课程讲解新建DaVinci工程,听上去新建工程很简单,但是还是需要很多的准备工作和细节。主要内容是新建工程和导入dbc文件和导入arxml文件的方法 主要步骤 新建DaVinci工程 导入.dbc通信矩阵文件 导入Mcal的arxml文件 实验视频2:Mcal配置 提示:版权所在,违

雪云飞星的博客 6275

Win11 1 月更新黑屏循环故障技术分析与解决方案

2026年1月30日Windows 11更新引发黑屏循环故障,主要影响2018年前出厂、采用MBR分区及特定BIOS固件的设备,尤其对使用经典版Outlook(POP协议)的用户影响显著。故障表现为系统无限重启黑屏,导致数据访问中断。分析表明,问题源于硬件兼容性、分区格式与系统更新的交互冲突。解决方案包括进入安全模式回滚更新、暂停自动更新、升级驱动/BIOS,以及等待微软官方补丁。建议用户更新前评估硬件兼容性并备份数据,企业环境应建立分阶段更新测试机制。该事件为系统更新风险管理提供了重要参考。

博客 1441

Python + Selenium,分分钟搭建 Web 自动化测试框架

本节课程介绍 Selenium 的功能作用及安装、环境配置,并介绍 Selenium 常用的语法。知识点。

1万+

ChatGPT启蒙之旅:弟弟妹妹的关键概念入门

本文主要介绍了ChatGPT启蒙之旅:弟弟妹妹的关键概念探险,希望能对初学大模型的同学们有所帮助。 文章目录 1. 背景 2. GPT是个什么样的人? 3. GPT使用的核心思维 4. GPT使用的场景介绍

herosunly的博客 16万+

基于Python+Selenium的web自动化测试框架详解

随着Web应用程序的广泛应用和不断发展,Web自动化测试已经成为软件质量保证中的一个重要环节。而Python+Selenium作为一组强大的工具和框架,已经成为Web自动化测试领域中的热门技术之一。Python+Selenium可以帮助我们快速、准确地模拟用户行为和操作,并检测Web应用程序的正确性、稳定性和可靠性。本文将深入探讨Python+Selenium的Web自动化测试框架,包括其概念、目标、流程和最佳实践。

nhb687095的博客 2098

Windows10下安装VMware16虚拟机

由于本人系统为Windows 10 家庭中文版,无法安装Linux子系统WSL,虽然网上也有强制安装的方法,但为保险起见,还是把之前的VMware虚拟机重新进行安装,并浅浅记录一下安装过程。

沉香best的博客 862

使用 ABAP Development Tool 登录 SAP BTP ABAP 环境时,遇到弹出框应该怎么办?

但在实际环境里,隐私模式、第三方 Cookie 禁止、跨站追踪限制、缓存代理误命中、混合内容拦截等因素,都可能让这条跳转链路被打断。等),浏览器会弹出系统原生登录框,请求用户输入账号和口令或做集成认证。只要它们在响应头里出现,浏览器就会理直气壮地弹框,这是协议层的强约定。,最终弹出原生登录框。前端与网关领域有个通用的经验规则:如果你看到了原生登录框,而期望的是带样式的。环境里的登录方式表述为基于浏览器的前端认证,也就是这类重定向式的交互。环境的具体落地,拆出几类常见诱因与排障路径,并穿插真实世界的案例。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 368

使用 Selenium 进行 Web 自动化:详细操作指南

通过以上内容,您可以快速上手 Selenium 并实现各种自动化任务。Selenium 的强大功能使其成为 Web 自动化测试的首选工具之一。

2401_89793006的博客 1420

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

基于Selenium+Python的web自动化测试框架

Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid。Selenium IDE:Firefox的一个扩展,它可以进行录制回放,并把录制的操作以多种语言(例如java、python等)的形式导出成测试用例。Selenium WebDriver:提供Web自动化所需的API,主要用作浏览器控制、页面元素选择和调试。

jj2772367224的博客 2180

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python基于Selenium的web自动化框架

Selenium 是一个基于浏览器的自动化工具,它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid:

m0_70669463的博客 1781

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Python自动化实战 —— 使用Selenium进行Web自动化

Selenium是一个自动化测试工具,它可以模拟用户在浏览器中的操作,比如点击、输入、选择等等。它支持多种浏览器,包括Chrome、Firefox、Safari等等,并且可以在多个平台上运行。在本篇文章中,我们介绍了如何使用Python的Selenium库进行Web自动化,并且演示了如何将它应用于实际项目中。如果你想要提高工作效率,或者想要学习如何进行自动化测试、数据采集等等,那么Selenium是一个非常好的选择。这些资料,对于【软件测试。

chengxuyuznguoke的博客 1712
上一篇: chromedriver、geckodriver、MicrosoftWebDriver、IEDriverServer和operadriver之间的恩怨纠葛
下一篇: selenium进阶之web自动化项目框架搭建(Python版)
testleaf
博客等级 码龄7年 3514粉丝 72原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

testleaf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值