selenium教程-程序员宅基地

技术标签: python  selenium  chrome  

ps:该教程为selenium 3版本的使用

1.介绍

Selenium是一个自动化测试框架,它可以模拟用户在浏览器中的操作,例如点击、输入、提交表单等等。它可以用于自动化测试、网页爬虫、数据抓取等多种场景。

Selenium可以支持多种编程语言,例如Python、Java、C#等,同时也支持多种浏览器,例如Chrome、Firefox、Safari等。它的核心是WebDriver,WebDriver可以与不同的浏览器进行交互,并且提供了一系列的API,用于模拟用户在浏览器中的操作。

2.安装

首先,你需要安装 Selenium。你可以通过在终端或命令提示符中输入以下命令来安装它:

pip install selenium

接下来,你需要下载适用于你所使用的浏览器的 webdriver。例如,如果你要使用 Chrome 浏览器,你需要下载 Chrome 浏览器的 webdriver,可以从以下链接下载:
Chrome

下载 webdriver 后,你需要将它添加到你的系统环境变量中,以便 Selenium 可以找到它。

下面是一个使用 Selenium 打开网页并获取标题的示例:

from selenium import webdriver

# 创建浏览器实例
browser = webdriver.Chrome()

# 访问页面
browser.get('https://www.baidu.com/')

# 获取页面标题
print(browser.title)

# 关闭浏览器
browser.quit()

这个示例首先导入 webdriver 模块,然后创建一个 Chrome 浏览器实例。它使用 get 方法访问百度的网页,并使用 title 属性获取页面标题。最后,它调用 quit 方法关闭浏览器。

注意,在这个示例中,你需要替换 webdriver.Chrome() 为你所使用的浏览器的 webdriver。此外,你还需要下载适用于你所使用的浏览器的 webdriver,例如 Chrome 浏览器的 webdriver。

可以发现浏览器打开了百度,并且终端中输出了标题百度一下,你就知道,说明安装成功!

3. browser对象属性与方法

在Selenium中,Browser对象代表一个Web浏览器窗口,提供了许多属性和方法来控制浏览器行为。下面是一些常用的Browser对象属性和方法:

属性:

current_url:获取当前浏览器窗口的URL。
title:获取当前页面的标题。
window_handles:获取当前浏览器所有窗口的句柄。
page_source:获取当前页面的HTML源代码。

方法:

get(url):加载指定的URL。
back():返回上一页。
forward():前进到下一页。
refresh():刷新当前页面。
close():关闭当前窗口。
quit():关闭所有窗口并退出浏览器。
maximize_window():最大化当前窗口。
set_window_size(width, height):设置当前窗口的大小。

下面是一个基础的示例,用于打开Google网站,搜索关键字并关闭浏览器:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# 创建Chrome浏览器对象
browser = webdriver.Chrome()

# 打开Google网站
browser.get("https://www.google.com")

# 查找搜索框并输入关键字
search_box = browser.find_element_by_name("q") # 找到 name="q"的标签,就是一个搜索标签
search_box.send_keys("Python")  # 向搜索标签输入一些字

# 提交搜索
search_box.send_keys(Keys.RETURN)  # 按下提交按钮

# 输出搜索结果数量  此时的browser已经到了搜索的页面,然后在搜索的页面找到id="result-stats" 的那个元素
results = browser.find_element_by_id("result-stats") 
# 模拟在搜索框中输入搜索关键词并按下回车键来提交搜索。Keys.RETURN 是 selenium 中的一个特殊按键常量,表示回车键。
# 输出元素里的文本内容
print(results.text)

# 关闭浏览器
browser.quit()

4. 扫码成功登陆微博

该案例模仿浏览器登陆,然后扫码登陆微博的主页,最后打印出微博的标题

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# 初始化Chrome浏览器
driver = webdriver.Chrome()

# 打开微博登录页
driver.get("https://weibo.com/login.php")
driver.maximize_window()
print("成功打开微博页面")
# 等待页面加载
time.sleep(10)

# 切换到扫码登录页
driver.find_element_by_xpath('//*[@id="pl_login_form"]/div/div[1]/div/a[2]').click()
print("成功点击扫码登陆")
# 等待二维码加载
time.sleep(20)           # 此时扫码用微博手机扫码登陆    


print(driver.title)

time.sleep(5)

# 关闭浏览器
driver.quit()

5. 利用selenium下载用户头像

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import requests
import os

driver = webdriver.Chrome()

# 打开页面
driver.get("https://weibo.com/u/2029906001?tabtype=album")

# 等待页面加载完成
'''
WebDriverWait等待目标图片元素出现,直到presence_of_element_located条件得到满足,或者超时时间达到10秒。等待期间,程序会每隔500毫秒检查一次条件是否得到满足。如果条件在超时时间内得到满足,程序继续执行;如果超时时间到达,程序将抛出TimeoutException异常。
'''
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="app"]/div[2]/div[2]/div[2]/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div/div/div[4]/div/div[1]/img')))

driver.execute_script("window.scrollBy(0,50)")

# 找到目标元素
img_tag = driver.find_element_by_xpath('//*[@id="app"]/div[2]/div[2]/div[2]/main/div[1]/div/div[2]/div[2]/div[1]/div[2]/div/div/div[4]/div/div[1]/img')
img_url = img_tag.get_attribute('src')

print(img_url)
response = requests.get(img_url)
print(response.cookies)
print(response.status_code)

# 创建保存图片的目录
if not os.path.exists('images'):
    os.makedirs('images')

# 从URL中提取文件名
filename = img_url.split('/')[-1]

# 将响应内容保存为图片文件
with open('images/' + filename, 'wb') as f:
    f.write(response.content)
# 关闭浏览器
driver.quit()



6.常用的函数介绍

6.1webdriver.Chrome()

webdriver模块中的webdriver.Chrome()、webdriver.Firefox()等函数:用于启动对应浏览器的实例,返回一个WebDriver对象。

from selenium import webdriver
# 启动Chrome浏览器
driver = webdriver.Chrome()
# 启动Firefox浏览器
driver = webdriver.Firefox()

6.2 WebDriver对象的get(url)函数

用于访问指定的url。

from selenium import webdriver

# 启动Chrome浏览器
driver = webdriver.Chrome()

# 访问百度
driver.get('https://www.baidu.com')

6.3 find_element()

这个函数可以指定查找的方式,方式通过By指定出。
常见的查找方式包括By.ID、By.NAME、By.CLASS_NAME、By.TAG_NAME、By.LINK_TEXT、By.PARTIAL_LINK_TEXT、By.XPATH和By.CSS_SELECTOR等。

from selenium import webdriver
from selenium.webdriver.common.by import By  # 注意 By的位置!

# 启动Chrome浏览器
driver = webdriver.Chrome()

# 访问百度
driver.get('https://www.baidu.com')

# 查找搜索框
search_box = driver.find_element_by_id('kw')

# 查找搜索按钮
search_button = driver.find_element(By.XPATH, '//input[@value="百度一下"]')

6.4 send_keys(value)

WebElement对象的send_keys(value)函数:用于在输入框中输入文本。

from selenium import webdriver

# 启动Chrome浏览器
driver = webdriver.Chrome()

# 访问百度
driver.get('https://www.baidu.com')

# 查找搜索框
search_box = driver.find_element_by_id('kw')

# 在搜索框中输入关键词
search_box.send_keys('Python')

6.5 click()

WebElement对象的click()函数:用于模拟点击操作。

from selenium import webdriver

# 启动Chrome浏览器
driver = webdriver.Chrome()

# 访问百度
driver.get('https://www.baidu.com')

# 查找搜索框
search_box = driver.find_element_by_id('kw')

# 在搜索框中输入关键词
search_box.send_keys('Python')

# 查找搜索按钮并点击
search_button = driver.find_element_by_id('su')
search_button.click()

6.6 presence_of_element_located

expected_conditions模块中的presence_of_element_located(locator)函数:用于等待元素加载完成。

EC.presence_of_element_located(locator)是Selenium WebDriver提供的等待条件之一,用于等待特定元素的存在。

参数:

locator: 元素定位器,可以是元组,包含两个值,第一个表示元素定位的方式(By.ID、By.XPATH、By.NAME等),第二个表示定位器的具体值(例如"myElement")。

返回值:

返回等待条件对象,用于后续等待调用。如果等待超时,将引发TimeoutException。如果在等待期间元素被找到,则返回该元素。
# 导入所需的模块
from selenium.webdriver.common.by import By  # 导入Selenium中的定位方式。
# WebDriverWait类,创建一个等待对象
from selenium.webdriver.support.ui import WebDriverWait  # 导入Selenium中的等待方法。
from selenium.webdriver.support import expected_conditions as EC # 导入Selenium中的预期条件模块
from selenium import webdriver  #  导入Selenium中的webdriver模块,以便打开浏览器。

# 创建一个Chrome浏览器实例并访问页面
driver = webdriver.Chrome()
driver.get("http://www.example.com")

# 等待页面加载完成
wait = WebDriverWait(driver, 10)  # 创建一个WebDriverWait对象,等待最多10秒
locator = (By.ID, "myElement")  # 定位元素的方式和值
element = wait.until(EC.presence_of_element_located(locator))  # 等待元素加载完成,并返回该元素

# 操作元素
element.click()  # 点击该元素

6.7 等待对象.until()函数

利用from selenium.webdriver.support.ui import WebDriverWait类创建的等待对象,可以用于等待页面中某个元素加载完成后,再进行操作。

通常配合from selenium.webdriver.support import expected_conditions as EC 条件类中的函数一起使用,用于等待页面中的某一个元素加载完成之后,再进行下一步的操作

等待对象.until()函数本质:
wait.until() 是一个高阶函数,它的参数是一个函数(或函数名),返回值是一个函数对象。在上面的例子中,我们使用EC.presence_of_element_located() 作为参数传递给了 wait.until(),它返回一个函数对象,这个函数对象在被调用时会判断元素是否存在并返回 TrueFalse
wait.until() 接受一个函数作为参数,它会循环调用这个函数,直到返回值为 True 或者超时时间到了为止。在每次调用函数时,wait.until() 会将 WebDriver 对象传递给函数,以便在函数中可以使用 WebDriver 对象进行元素查找和操作。这个过程也称为轮询,即不断尝试直到目标条件满足或者超时。

7. 操作鼠标

from selenium.webdriver.common.action_chains import ActionChains
Selenium提供了ActionChains类来模拟鼠标操作。ActionChains是一种用于将多个动作链接在一起以形成更复杂操作的技术,可以模拟鼠标移动、单击、双击、拖放、键盘操作等。

下面是一个示例,模拟鼠标移动到元素上并单击它:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

# 打开浏览器并访问页面
driver = webdriver.Chrome()
driver.get("http://www.example.com")

# 找到目标元素
# 使用driver实例的find_element_by_xpath()方法查找指定路径的网页元素,并将其赋值给变量element。
element = driver.find_element_by_id("myElement")

# 模拟鼠标移动并单击
# 使用ActionChains模块创建一个鼠标动作链实例,并将其赋值给变量actions。然后,使用actions实例的move_to_element()方法将鼠标移动到指定元素上,click()方法模拟鼠标左键单击操作,最后使用perform()方法执行鼠标动作链。
actions = ActionChains(driver)
actions.move_to_element(element).click().perform()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_59251000/article/details/130463800

智能推荐

中文Win7下成功安装calabash-android步骤-程序员宅基地

文章浏览阅读103次。2019独角兽企业重金招聘Python工程师标准>>> ...

.net DropDownList默认选择指定的值_.net dropdownlist 默认-程序员宅基地

文章浏览阅读1.8k次。.net DropDownList默认选择指定的值_.net dropdownlist 默认

计算文本相似度,输出相似度最高的n个_tencent-ailab-embedding-zh-d100-v0.2.0--程序员宅基地

计算文本相似度的方法有TFidf、word2vec、SpaCy和Bert。本文介绍了这些方法的概念和代码,并对它们的结果进行了对比。配置包括创建虚拟环境和安装必要的库。结果展示了相似度排序和相似句子的DataFrame。通过对比这些方法,可以选择相似度最高的n个句子。

5G时代探索互动立体视频信息承载的新可能-程序员宅基地

文章浏览阅读908次。5G时代对于视频行业的发展和业务形态将是一个重要的助推,但5G时代带来的改变不只是带宽提升和延迟降低这两个最直接的因素。本次LiveVideoStackCon 2020线上峰会我们邀请到..._探索从平面到三维视频信息表达的新可能

combiner优化_合路器 combiner csdn-程序员宅基地

文章浏览阅读484次。combiner为何物1. Combiner是MR程序中Mapper和Reduce之外的一种组件2. Combiner组件的父类是Reducer3. Combiner和Reducer之间的区别在于运行的位置,Combiner可以看做局部的Reducer(local reducer)4. Reducer接收全局的MapTask 所输出的结果5. Combiner在MapTask节点中运行..._合路器 combiner csdn

Cloudera Manager 5.15.2离线安装笔记(一)_cdh-5.15.2-1.cdh5.15.2.p0.3-el7.parcel-程序员宅基地

文章浏览阅读1k次。Cloudera Manager 5.15.2离线安装笔记(一)工欲善其事必先利其器,想要学好一门技术首先得有趁手的工具,要想学好大数据技术,还是得有比较好的工具才行。本笔记记录的是安装Cloudera Manager的过程。CDH的全称是Cloudera’s Distribution Including Apache Hadoop,是hadoop众多发行版本中的一种,是由Cloudera维护..._cdh-5.15.2-1.cdh5.15.2.p0.3-el7.parcel

随便推点

TCP四次握手为什么客户端等待的时间是2MSL_客户端等待2msl-程序员宅基地

文章浏览阅读772次。MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。总而言之,客户端在发送完ACK报文段之后,继续等待2MSL时间,如果发给服务端的ACK报文段丢失了,服务端重发的FIN报文段在也一定能在这个时间内到达客户端。_客户端等待2msl

HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站_html商城代码-程序员宅基地

文章浏览阅读2.1w次,点赞46次,收藏423次。精彩专栏推荐 【作者主页——获取更多优质源码】 【web前端期末大作业——毕设项目精品实战案例(1000套)】1 网页简介:此作品为学生个人主页网页设计题材,HTML+CSS 布局制作,web前端期末大作业,大学生网页设计作业源码,这是一个不错的网页制作,画面精明,代码为简单学生水平, 非常适合初学者学习使用。2.网页编辑:网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Web......_html商城代码

知乎全面部署数字联盟IDFA兼容解决方案 从容应对iOS 14新规_idfa对接逻辑-程序员宅基地

文章浏览阅读360次。近日,知乎与数字联盟达成合作,全面集成数字联盟IDFA兼容解决方案,于iOS14隐私新规下合规获取IDFA,完成用户体系与历史资产平滑继承,顺利进行精准广告投放业务。  数字联盟是国内一家知名的商用ID服务商,凭借6年可信ID设备数据积累和5年广告流量的活跃数据沉淀,在iOS 14新规发布后迅速跟进,推出首款能帮助开发者在新规后合规获取全量用户的 iOS 14 ID 解决方案。App集成数字联盟模块即可实时获取IDFA。  数字联盟IDFA解决方案之所以得知乎认可,源于数字联盟产品及技术上皆具备无_idfa对接逻辑

ReportViewer Control in Visual Studio 2010-程序员宅基地

文章浏览阅读76次。IntroductionReportViewer is a freely redistributable control that enables embedding reports in applications developed using the .NET Framework. Reports are designed with drag-and-drop simplicity usi..._visual studio 2010 reportviewercontrol 150.1484.0

服务器上的Git-程序员宅基地

文章浏览阅读86次。前面的话  如果想与他人使用,除了使用Git来完成日常工作之外,还需要一个远程的Git仓库。尽管从技术上可以从个人的仓库里推送和拉取修改内容,但并不鼓励这样做,因为一不留心就很容易弄混其他人的进度。因此,更好的合作方式是建立一个大家都可以访问的共享仓库,从那里推送和拉取数据。我们将这个仓库称为"Git服务器";代理一个Git仓库只需要花费很少的资源,几乎从不需要整个服务器来支持它的运行  ...

哈夫曼算法和它的严格证明_哈夫曼问题证明-程序员宅基地

文章浏览阅读2.7k次,点赞5次,收藏26次。哈夫曼算法最优哈夫曼树是啥算法步骤简介复杂度算法正确性证明最优哈夫曼树是啥有篇文章(字符串),想把它加密成01串。所以要给每个字符映射一个01串代表它,而且一个字符的01串不能是另一个的前缀,否则将出现二义性。所以可以把一颗二叉树的叶子节点看成字符,向左走和向右走分别为0和1,这样构造映射到的01串就不会有二义性,这个树就是哈夫曼树。为了使得01串总长度最小,就要构造最优哈夫曼树。显然每个字符的01串长度是字符节点的深度(到根节点经过的变数),所以使得len=∑cnti∗deepi,i∈σlen=\su_哈夫曼问题证明