简介

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. C#Autofac依赖注入批量注入 (目前版本.netcore3.0)

    上一文:C#依赖注入一看就会系列 链接:C#依赖注入(直白明了)讲解 一看就会系列 - 22222220 - 博客园 (cnblogs.com) 上一次我们知道了 为什么要依赖注入,这次我们就用使用人 ...

  2. 函数传参 Java JavaScript python 都是按值传递的

    实验代码如下: Java python JavaScript:

  3. typora永久插入图片

    https://c.runoob.com/front-end/59 首先将图片通过在线转码工具转换成base64的编码,并用以下格式嵌入即可,格式如下: ![image] (base64) 但是由于这 ...

  4. JZOJ 2022.02.11【提高A组】模拟

    \(\text{Solution}\) 首先把 \(T2\) 给切了,\(T1\) 找半天规律找不到 然后打了个表算是暴力了 \(T3\) 也暴... 太暴了... \(T4\) 直接啥也不会 \(\ ...

  5. JZOJ 4872.集体照

    \(\text{Problem}\) 一年一度的高考结束了,我校要拍集体照.本届毕业生共分 \(n\) 个班,每个班的人数为 \(A_i\).这次拍集体照的要求非常奇怪:所有学生站一排,且相邻两个学生 ...

  6. JZOJ 4253.QYQ在艾泽拉斯

    \(\text{Problem}\) 有向不联通图,求每个子图至多选出一条最大权值和的路径,求前 \(k+1\) 个 \(\text{Solution}\) 显然将每个子图缩点后 \(dp\),排序 ...

  7. Linux centos 代替方案: Rocky Linux (centos作者)

    官网: Rocky Linux

  8. 基于docker的spark分布式与单线程、多线程wordcount的对比实验

    1. 分布式环境搭建 1.1 基于docker的spark配置文件 docker-compose.yml version: '2' services: spark: image: docker.io/ ...

  9. LeetCode-429 N叉树的层次遍历

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal著作权归领扣网络所有.商业转载请联 ...

  10. 信息学奥赛介绍-CSP

    什么是信息学奥赛 信息学奥赛,全称为信息学奥林匹克竞赛,是教育部和中国科协委托中国计算机 学会举办的一项全国青少年计算机程序设计竞赛.主要分为NOIP(全国联赛),夏令营 NOI比赛的扩展赛,也称全国 ...