CentOS7安装Selenium(centos7安装jdk)
off999 2024-11-05 10:59 32 浏览 0 评论
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。 Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。
Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。
可以从 PyPI 网站下载 Selenium库https://pypi.python.org/simple/selenium , 也可以用第三方管理器 pip用命令安装:pip3 install selenium
selenium 官方参考文档: http://selenium-python.readthedocs.io/index.html
selenium中文文档: http://selenium-python-zh.readthedocs.io
Selenium也分为有界面浏览器和无界面浏览器:
谷歌驱动(chromedriver)下载地址:http://chromedriver.storage.googleapis.com/index.html
安装chromedriver请参照文章:Centos7安装Headless Chrome
火狐驱动下载路径(GeckoDriver):https://github.com/mozilla/geckodriver/releases (2.3.8是最新的,下载的驱动版本一定要支持你当前的浏览器版本)
Selenium 库里有个叫 WebDriver 的 API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像 BeautifulSoup 或者其他 Selector 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫。
注意: 我们使用的有界面浏览器,它虽然方便我们观察,但是在实际运用中是非常消耗性能的 我们也可以使用Chrome的无界面浏览器,除了没有浏览器界面以外,其它的相关操作都与有界面浏览器相同
Chrome的有、无界面浏览器实现代码如下:
#-- coding:UTF-8 -*-
#导入?webdriver
from lxml import etree
from selenium import webdriver
from bs4 import BeautifulSoup
#?要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys import Keys
import time
#无界面浏览器相关设置
#?创建chrome参数对象
opt = webdriver.ChromeOptions()
#把chrome设置成为无界面模式
opt.set_headless()
#创建chrome无界面对象
driver = webdriver.Chrome(options=opt, executable_path='/root/chromedriver')
#创建chrome有界面对象
driver = webdriver.Chrome(executable_path='/root/chromedriver')#调用Chrome浏览器创建浏览器对像(指定一下位置)
#driver.implicitly_wait(1000)
time.sleep(2)
#打开浏览器,模拟浏览器请求页面
driver.get('http://www.baidu.com/')
#获取页面的源码信息
html = driver.page_source
print(html)
#soup = BeautifulSoup(html,“html.parser”)
soup = etree.HTML(html)
#?获取页面名为?wrapper的id标签的文本内容
data = driver.find_element_by_id("wrapper").text
#打印数据内容
print(data)
#打印标题数据
print(driver.title)
#向百度的搜索框输入搜索关键字
driver.find_element_by_id('kw').send_keys('美女')
#百度搜索按钮,click()?是模拟点击
driver.find_element_by_id('su').click()
#获取当前页面的cookies()
cookies = driver.get_cookies()
cookie = ''
for item in cookies:
????cookie += item['name']+item['value']+' ;'
????print(cookie[:-1])
#全选输入框中的内容ctrl+a?
print(driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a'))
?
# ctrl+x?剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
#清空输入框内容
driver.find_element_by_id('kw').clear()
#输入框重新输入内容
driver.find_element_by_id('kw').send_keys('风景')
#模拟回车键
driver.find_element_by_id('su').send_keys(Keys.RETURN)
#获取当前的url
currentUrl = driver.current_url
print(currentUrl)
#截取网页页面(生成当前的页面快照并保存)
driver.save_screenshot('baidu.png')
?
#睡眠7秒
time.sleep(7)
#?关闭浏览器
driver.quit()
#?关闭当前页面,如果只有一个页面,会关闭浏览器
driver.close()
一、页面的相关操作:
Selenium 的 WebDriver提供了各种方法来寻找元素,假设下面有一个表单输入框:
<input type="text" name="user-name" id="passwd-id">
取id标签值
element = driver.find_element_by_id("passwd-id")
获取name标签值
element = driver.find_element_by_name("user-name")
获取标签名值
element = driver.find_elements_by_tag_name("input")
也可以通过XPath来匹配
element = driver.find_element_by_xpath("//input[@id='passwd-id']")
二、定位UI元素 (WebElements)
关于元素的选取,有如下的API 单个元素选取
find_element_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
1.By ID
假设有一个div的,他的id为coolestWidgetEvah,我们可以通过下面的方式来找到这个div
<div id="coolestWidgetEvah">...</div>
方式一:
element = driver.find_element_by_id("coolestWidgetEvah")
方式二:倒入相关模块
from selenium.webdriver.common.by import By
##### 使用如下
element = driver.find_element(by=By.ID, value="coolestWidgetEvah")
2.By Class Name
<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>
实现
cheeses = driver.find_elements_by_class_name("cheese")
----------------or-------------------
from selenium.webdriver.common.by import By
cheeses = driver.find_elements(By.CLASS_NAME, "cheese")
3.By Tag Name
<iframe src="..."></iframe>
实现
frame = driver.find_element_by_tag_name("iframe")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
frame = driver.find_element(By.TAG_NAME, "iframe")
4.By Name
<input name="cheese" type="text"/>
实现
cheese = driver.find_element_by_name("cheese")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.NAME, "cheese")
5.By Link Text
<a href="http://www.google.com/search?q=cheese">下一页</a>
实现
cheese = driver.find_element_by_link_text("下一页")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.LINK_TEXT, "下一页")
6.By Partial Link Text
通过局部的Link Text实现查找
<a href="http://www.google.com/search?q=cheeselink">search for cheese</a>
实现
cheese = driver.find_element_by_partial_link_text("cheese")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.PARTIAL_LINK_TEXT, "cheese")
By CSS
<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
实现
cheese = driver.find_element_by_css_selector("#food span.dairy.aged")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
cheese = driver.find_element(By.CSS_SELECTOR, "#food span.dairy.aged")
By XPath
<input type="text" name="example" />
<input type="text" name="other" />
inputs = driver.find_elements_by_xpath("//input")
------------------------ or -------------------------
from selenium.webdriver.common.by import By
inputs = driver.find_elements(By.XPATH, "//input")
三、页面等待
注意:这是非常重要的一部分!! 现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。 为了避免这种元素定位困难而且会提高产生 ElementNotVisibleException 的概率。所以Selenium 提供了两种等待方式,一种是隐式等待,一种是显式等待。 隐式等待是等待特定的时间,显式等待是指定某一条件直到这个条件成立时继续执行。
1.隐式等待
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # seconds
driver.get("http://www.xxxxx.com/loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
2.显式等待
显式等待指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常了。
from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverWait 库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions 类,负责条件出发
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://www.xxxxx.com/loading")
try:
##### 会在这里等待,如果10秒内 id="myDynamicElement" 出现则返回,如果不出现则报异常
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
如果不写参数,程序默认会 0.5s 调用一次来查看元素是否已经生成,如果本来元素就是存在的,那么会立即返回。 下面是一些内置的等待条件,你可以直接调用这些条件,而不用自己写某些等待条件了。
title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 确保节点在本地加载出来传入元组(By.ID,'password')
visibility_of_element_located 节点可见,传入定位元组
presence_of_all_elements_located 所有节点加载出来
text_to_be_present_in_element 某个节点的文本包含某文字
text_to_be_present_in_element_value 某个节点的值包含某文字
frame_to_be_available_and_switch_to_it 加载并切换
invisibility_of_element_located 节点不可见
element_to_be_clickable – 节点可点击.
staleness_of 判断某个节点是否在文本中
element_located_to_be_selected 节点可选择,传入定位元组
alert_is_present 是否出现警告
四、鼠标动作链
有些时候,我们需要再页面上模拟一些鼠标操作,比如双击、右击、拖拽甚至按住不动等,我们可以通过导入ActionChains 类来做到:
#-*- coding:UTF-8 -*-
#####?导入ActionChains类
from?selenium.webdriver import ActionChains
from?selenium import webdriver
from?selenium.webdriver.common.keys import Keys
import?time
driver = webdriver.Chrome(executable_path='/Users/ljh/Desktop/chromedriver')
driver.get('http://www.baidu.com')
#####?鼠标移动到ac位置,移动到搜索的位置
action = driver.find_element_by_xpath('//div[@id="u1"]/a[4]')
ActionChains(driver).move_to_element(action).perform()
#####?在action上单击
ActionChains(driver).move_to_element(action).click(action).perform()
#####?在?ac?位置双击
ActionChains(driver).move_to_element(action).double_click(action).perform()
#####?在?ac?位置右击
ActionChains(driver).move_to_element(action).context_click(action).perform()
#####?在?ac?位置左键单击hold住
ActionChains(driver).move_to_element(action).click_and_hold(action).perform()
#####?将?ac1?拖拽到?ac2?位置
time.sleep(5)
ac1 = driver.find_element_by_id("su")
ac2 = driver.find_element_by_class_name('mnav')
ActionChains(driver).drag_and_drop(ac1,ac2).perform()
time.sleep(5)
driver.quit()五、填充表单
我们已经知道了怎样向文本框中输入文字,但是有时候我们会碰到标签的下拉框。直接点击下拉框中的选项不一定可行。
<select id="status" class="form-control valid" name="status">
<option value=""></option>
<option value="0">未审核</option>
<option value="1">初审通过</option>
<option value="2">复审通过</option>
<option value="3">审核不通过</option>
</select>
Selenium专门提供了Select类来处理下拉框。 其实 WebDriver 中提供了一个叫 Select 的方法,可以帮助我们完成这些事情:
导入 Select 类
from selenium.webdriver.support.ui import Select
#### 找到 name 的选项卡
select = Select(driver.find_element_by_name('status'))
#### 选择
select.select_by_index(1)
select.select_by_value("0")
select.select_by_visible_text(u"未审核")
以上是三种选择下拉框的方式,它可以根据索引来选择,可以根据值来选择,可以根据文字来选择。注意:
- index 索引从 0 开始
- value是option标签的一个属性值,并不是显示在下拉框中的值
- visible_text是在option标签文本的值,是显示在下拉框的值
全部取消选择怎么办呢?很简单:
select.deselect_all()
六、弹窗处理
当你触发了某个事件之后,页面出现了弹窗提示,处理这个提示或者获取提示信息方法如下:
alert = driver.switch_to_alert()
七、(选项卡管理)页面切换
一个浏览器肯定会有很多窗口,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:
js = 'window.open("http://www.baidu.com/")'
driver.execute_script(js)
driver.switch_to.window(driver.window_handles[0])
也可以使用 window_handles 方法来获取每个窗口的操作对象。例如:
for handle in driver.window_handles:
driver.switch_to_window(handle)
1.切换Frame
网页中有一种节点叫做iframe,也就是子Frame,我们不能够直接获取到子Frame中的节点,要想获取到需要切换到子frame下
login_frame:为子frame的名称
driver.switch_to_frame('login_frame')
2.页面前进和后退
操作页面的前进和后退功能:
driver.forward() #前进
driver.back() # 后退
八、Cookies
获取页面每个Cookies值,用法如下
cookies = driver.get_cookies()
for cookie in cookies:
print("%s -> %s" % (cookie['name'], cookie['value']))
cookie_dict = {i['name']:i['value'] for i in cookies}
print(cookie_dict)
1.添加cookies
driver.add_cookie(cookie_dict)
2.删除Cookies,用法如下
- 删除一个特定的cookie
driver.delete_cookie("CookieName")
- 删除所有cookie
driver.delete_all_cookies()
九、异常处理
- 请求超时异常处理
from selenium.common.exceptions import TimeoutException
try:
brower.get(url)
except TimeoutException:
print('Time out')
- 找不到标签的异常处理
from selenium.common.exceptions import NoSuchElementException
try:
brower.find_element_by_id('').click()
except NoSuchElementException:
print('没有这个标签')
finally:
print('有标签')
相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
-
TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对...
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
-
其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为...
- 性能测试100集(12)性能指标资源使用率
-
在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总...
- Linux 服务器常见的性能调优_linux高性能服务端编程
-
一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里...
- Nginx性能优化实战:手把手教你提升10倍性能!
-
关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe...
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
-
关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m...
- Kubernetes 高并发处理实战(可落地案例 + 源码)
-
目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB...
- 高并发场景下,Nginx如何扛住千万级请求?
-
Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统...
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
-
SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序...
- Docker-基础操作_docker基础实战教程二
-
一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true...
- 你有空吗?跟我一起搭个服务器好不好?
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手...
- 部署你自己的 SaaS_saas如何部署
-
部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。...
- Docker Compose_dockercompose安装
-
DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,...
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
-
前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论...
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
-
Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
