简介

Selenium是一款强而有力的前端应用测试工具,也非常适合搭配Python作为网络爬虫的工具;Selenium可以模拟使用者所有浏览器操作的动作,包括输入文本、点击按钮及拖拽进度条等。有鑑于新版的Selenium 4与旧版的语法有若干明显的差异,特别撰写本文来与朋友们釐清并分享。

安装

安装Selenium套件

pip install selenium     

安裝WebDriver

可以去这裡下载WebDriver,注意要与你的Chrome浏览器版本相同。下载并解压缩后会得到一个chromedriver.exe的可执行档,建议将这个档案複製到你的Python项目资料夹下,可以避免路径的问题。

浏览网页

1 from selenium import webdriver
2 from selenium.webdriver.chrome.service import Service
3
4 service = Service('./chromedriver') # 设定chromedriver路径
5 driver = webdriver.Chrome(service = service)
6 driver.get('https://www.baidu.com') # 浏览百度网站首页
7 print(driver.title) # 百度一下,你就知道

查找单一元素

"""
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
</form>
</body>
</html>
""" login_form = driver.find_element(By.ID, 'loginForm') # 用ID查找
username = driver.find_element(By.NAME, 'username') # 用NAME查找
username = driver.find_element(By.XPATH, "//input[@name='username']") #用XPATH查找
"""
<html>
<body>
<h2>Welcome!</h2>
<p class="content">Are you a stranger here?</p>
<a href="continue.html">Continue</a>
<a href="cancel.html">Cancel</a>
</body>
</html>
""" continue_link = driver.find_element(By.LINK_TEXT, 'Continue') # 用超链接文本查找
continue_link = driver.find_element(By.PARTIAL_LINK_TEXT, 'Cont') # 用部分超链接文本查找
heading = driver.find_element(By.TAG_NAME, 'h2') # 用标籤名称查找
content = driver.find_element(By.CLASS_NAME, 'content') # 用Class名称查找
content = driver.find_element(By.CSS_SELECTOR, 'p.content') # 用CSS选择器查找

查找多个元素

返回值将会是一个列表(list)。

login_form = driver.find_elements(By.ID, 'loginForm')  # 用ID查找
username = driver.find_elements(By.NAME, 'username') # 用NAME查找
username = driver.find_elements(By.XPATH, "//input[@name='username']") #用XPATH查找
continue_link = driver.find_elements(By.LINK_TEXT, 'Continue') # 用超链接查找
continue_link = driver.find_elements(By.PARTIAL_LINK_TEXT, 'Cont') # 用部分超链接查找
heading = driver.find_elements(By.TAG_NAME, 'h2') # 用标籤名称查找
content = driver.find_elements(By.CLASS_NAME, 'content') # 用Class名称查找
content = driver.find_elements(By.CSS_SELECTOR, 'p.content') # 用CSS选择器查找

属性值

attribute_value = element.get_attribute('attribute-name')  # 取得"attribute-name"的属性值"attribute_value"

预期条件

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By wait = WebDriverWait(driver, 10)
element = wait.until(EC.visibility_of_element_located((By.ID, 'my-element-id'))) # 最多等待10秒让元素变为可见
elements = wait.until(EC.visibility_of_all_elements_located((By.CLASS_NAME, 'my-class'))) # 最多等待10秒,让所有元素都可见

等待

显式等待

显式等待用于指示 webdriver 在移动到自动化脚本中的其他步骤之前等待特定条件。

from selenium.webdriver.support import expected_conditions as EC
# expected_conditions模块用于指定要等待的条件 driver.get("https://www.example.com") element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "example-id")))
# WebDriverWait方法用于指定驱动程序和等待的最长时间,本例中一旦找到元素并可点击,脚本就会继续执行。 element.click()

隐式等待

隱式等待是被應用在尝试识别当前不可用的元素時,指示 webdriver 在特定时间内轮询 DOM(文档对象模型)。

driver.implicitly_wait(10)  # 设定隐式等待10秒
driver.get("https://www.example.com")
element = driver.find_element_by_id("example-id")
# 在此示例中,为Web驱动程序的整个生命周期设置了10秒的隐式等待。这意味着如果未找到元素,驱动程序将等待最多10秒然后抛出异常。如果在10秒内找到元素,脚本将继续执行。

单选按钮&复选框

radio_button.click()  # 选择单选按钮
if not checkbox.is_selected():
checkbox.click() # 选中或取消选中复选框

下拉列表

# 选择下拉列表中的选项
dropdown.select_by_visible_text("Option 1")
# 或者 dropdown.select_by_value("value_1")
# 或者 dropdown.select_by_index(0) """
需要注意的是,如果下拉列表不允许多选,则只能选择一个选项。如果下拉列表允许多选,则可以使用select_by_visible_text、select_by_value或select_by_index方法选择多个选项。如果想取消选中已选择的选项,可以使用deselect_by_visible_text、deselect_by_value或deselect_by_index方法来取消选择。如果想取消选择所有选项,则可以使用deselect_all方法。
"""

Cookies

driver.get("https://www.example.com")

cookie = {'name': 'example_cookie', 'value': '1234'}
driver.add_cookie(cookie) # 给浏览器增加一个Cookie example_cookie = driver.get_cookie('example_cookie') # 以Cookie的名称取得Cookie
print(example_cookie) cookies = driver.get_cookies() # 从浏览器取得所有Cookie
print(cookies) driver.delete_cookie('example_cookie') # 以Cookie的名称删除Cookie driver.delete_all_cookies() # 删除所有的Cookie driver.refresh() # 刷新网页

前后浏览

driver.get('https://www.baidu.com')
driver.get('https://world.taobao.com')
driver.back() # 向后浏览
print(driver.title) # 百度一下,你就知道
driver.forward() # 向前浏览
print(driver.title) # Taobao | 淘宝 - 花更少淘到宝

动作链

from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys action = ActionChains(driver)
action.move_to_element(element).click().perform() # 移至element并点击
action.context_click(element).perform() # 移至element并以右键点击 action.drag_and_drop(source_element, target_element).perform() # 將source_element拖放到target_element action.click(element).perform() # 点击element
action.double_click(element).perform() # 双击element action.key_down(Keys.CONTROL).send_keys("s").perform() #按下"Ctrl+S" action.send_keys("Hello, world!").perform() # 在當前文字框输入"Hello, world!"
action.send_keys_to_element(element, "Hello, world!").perform() # 在element文字框输入"Hello, world!"
action.send_keys_to_element(element, Keys.ENTER).perform() # 在element文字框输入"ENTER"

表单

driver.get('https://www.baidu.com')
driver.find_element(By.ID, 'kw').send_keys('Python') # 在文字框输入"Python"
driver.find_element(By.ID, 'su').submit() # 提交表单

滚动

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")  # 滚动至页面底部
driver.execute_script("window.scrollBy(0, 500)") # 将页面向下滚动500像素

框架

driver.switch_to.frame("my-frame")  # 通過名稱或ID切換到框架"my-frame"

element = driver.find_element(By.CSS_SELECTOR, "div.my-element")
print(element.text) driver.switch_to.default_content() # 切换回主框架

JavaScript

driver.execute_script("alert('Hello, world!');")  # 执行JavaScript

窗口

driver = webdriver.Chrome()  # 创建一个浏览器实例

driver.execute_script("window.open('');")  # 打开一个新的窗口

handles = driver.window_handles  # 获取所有窗口句柄

driver.switch_to.window(handles[-1])  # 切换到新窗口

driver.get("https://www.google.com")

# 在新窗口中搜索内容
search_box = driver.find_element_by_name("q")
search_box.send_keys("Selenium")
search_box.send_keys(Keys.RETURN) driver.close() # 关闭当前窗口 driver.switch_to.window(handles[0]) # 切换回原始窗口

截图

driver.save_screenshot('logo.png')

无头浏览器

from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True driver = webdriver.Chrome(options = options)

关闭

driver.close()  # 关闭当前窗口
driver.quit() # 关闭浏览器

2023最新版Selenium 4.6.0语法快速入门的更多相关文章

  1. Objective-C基础语法快速入门

    Objective-C基础语法快速入门 2010-11-04 16:32 折酷吧 zheku8 字号:T | T 假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C将会 ...

  2. Spring Boot 2.0 的快速入门(图文教程)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...

  3. .Net Core 3.0 IdentityServer4 快速入门

    .Net Core 3.0 IdentityServer4 快速入门 一.简介 IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架. 将 ...

  4. .Net Core 3.0 IdentityServer4 快速入门02

    .Net Core 3.0 IdentityServer4 快速入门 —— resource owner password credentials(密码模式) 一.前言 OAuth2.0默认有四种授权 ...

  5. Less 语法快速入门

    Less 语法快速入门 Less 是一门 CSS 预处理语言其可以运行在 Node 或浏览器端. 它将传统的 css 样式结构单一的排版顺序进行了优化,让我们可以通过层级嵌套的方式将 css 类名与H ...

  6. shell语法快速入门(1)

    #得到绝对路径 DIR=$(cd `dirname $0`;pwd) $DIR/file.txt #去掉#注释 egrep -v "(#|^$)" /etc/zabbix/zabb ...

  7. python语法快速入门(1)

    http://www.runoob.com/python/python-tutorial.html Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于PHP和Perl语言 ...

  8. T4语法快速入门

    1.什么是T4? T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit.T4(Text Template Transformation Toolk ...

  9. Ruby 语法快速入门

    作用域:指的是类,模块,方法 常量:无需指定类型,全大写 FANS = 100 puts "We have" + FANS.to_s + "fans" 变量 局 ...

  10. Vue3语法快速入门以及写一个倒计时组件

    Vue3写一个倒计时组件 vue3 beta版本发布已有一段时间了,文档也大概看了一下,不过对于学一门技术,最好的方法还是实战,于是找了一个比较简单的组件用vue3来实现,参考的是vant的count ...

随机推荐

  1. E - 树状数组 1【GDUT_22级寒假训练专题五】

    E - 树状数组 1 原题链接 题意 已知一个数列,你需要进行下面两种操作: 将某一个数加上 \(x\) 求出某区间每一个数的和 lowbit函数 定义一个函数\(f=lowbit(x)\),这个函数 ...

  2. 使用springboot cache + redis缓存时使用gzip压缩以提升性能

    背景 在高并发的场景中,我们通常会使用缓存提升性能.在使用springboot cache时,我们通常会使用基于JSON的序列化与反序列化. JSON具有可读性强,结构简单的特点,使用灵活. 但是JS ...

  3. Python:Excel自动化实践入门篇 甲【留言点赞领图书门票】

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s?__biz=MzUxMTgxMzExNQ==&mid=22 ...

  4. PostgreSQL数据库切割和组合字段函数

    Postgresql里面内置了很多的实用函数,下面介绍下组合和切割函数一.组合函数1.concata.语法介绍 concat(str "any" [, str "any& ...

  5. Postgresql的csv日志设置

    PG的日志系统比较完善,除去系统启动时指定的日志,wal日志等外,下面主要介绍另一个详细的输出日志:csv log. 涉及到的参数文件:$PGDATA/postgresql.conf涉及的主要参数: ...

  6. Study for Go ! Chapter two - Expression

    Study for Go ! Chapter two - Expression 1. Keyword Golang仅有 25 个保留关键字,体现了 golang 语法规则的简洁性 保留关键字不能用作常 ...

  7. js控制关闭layui的switch开关

    <input class="switch" type="checkbox" lay-skin="switch" lay-filter= ...

  8. zint

    一.Zint1. 介绍 Zint是一个软件,允许在任何广泛的公共领域条形码标准中轻松编码数据,并允许将这种功能集成到您自己的程序中. Zint项目的目标是提供一个完全跨平台的开源条形码生成解决方案,目 ...

  9. TCP怎样保证可靠传输

    TCP的可靠性保证 TCP主要提供了检验和,序列号/确认应答,超时重传,最大消息长度,滑动窗口控制等方法实现了可靠性传输. 检验和 通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错 ...

  10. Educational Codeforces Round 137 (Rated for Div. 2) - D. Problem with Random Tests

    期望 + 暴力 [Problem - D - Codeforces](https://codeforces.com/contest/1743/problem/E) 题意 给出一个长度为 \(n\;(1 ...