简介

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. nexus私服搭建的上传和下载

    下载 方法1 下载应该先在nexus中创建相关的库(宿主库.代理库.仓库组),也可以使用原有的库 随后在pom文件中增加以下代码,即可从私服中下载相关的依赖包(注:依赖包的下载首先基于本地库,本地库没 ...

  2. Idea创建类模板方法模板

    参考https://blog.csdn.net/sdut406/article/details/81750858 写代码是少不了注释的,但是自带的注释就几个,所以使用注释模板添加自定义的注释是个非常好 ...

  3. 远程控制 todesk

    最近发现的一个好用的远程连接软件 便是近些年推出来的 todesk 虽然qq的远程 和 向日葵的 远程连接也都可以达到我要实现的效果 但是体验起来的话 我个人还是觉得 todesk更好用一些 下载地址 ...

  4. 这是一篇乖巧的草稿——vscode上传代码到代码托管平台GitHub

    一.在GitHub上创建一个远程仓库: 以上,就创建好了一个名为pythonStudy的仓库,现在先别把它关掉,先最小化 二.安装版本管理工具git:git属于无脑安装,可以更改安装路径 打开项目文件 ...

  5. try...catch中finally子句的使用

    目录: finally的使用 finally面试题 final.finally.finalize的区别 finally子句的使用: 1.在finally子句中的代码是最后且一定会执行的,即使try语句 ...

  6. 自抗扰(ADRC)控制原理及控制器设计

    https://blog.csdn.net/weixin_43487974/article/details/127163824?spm=1001.2101.3001.6650.2&utm_me ...

  7. SPI的 CLK_POL和CLK_PHA

    1.模式0(CPOL=0,CPHA=0) 模式0特性: CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿 CPHA = 0:数据在第1个跳变沿(上升沿)采样 2.模式1(C ...

  8. Vladik and fractions

    题目大意 给出 \(n\),求一组 \(x,y,z\) 满足 \(\frac 1x + \frac 1y + \frac 1z = \frac 2n\) 若不存在合法的解,输出 \(-1\) 其中 \ ...

  9. CSS3--点击弹出菜单动画

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  10. nodejs 接收参数,js前端传参方法

    nodejs // 接口:查询检测结果 req.query接收 router.get('/getDetectionResult', (req, res) => { console.log(req ...