热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Selenium全攻略(这份可是我珍藏的操作总结)

这里我将以Chrome为例进行Selenium功能的演示~Selenium全攻略0.1.安装selenium库0.2.安装浏览器驱动1.1.初始化浏览器对象1.2.访问页面1.3.

这里我将以Chrome为例进行Selenium功能的演示~

Selenium全攻略0.1. 安装selenium库0.2. 安装浏览器驱动1.1. 初始化浏览器对象1.2. 访问页面1.3. 设置浏览器大小1.4. 刷新页面1.5. 前进后退3.1. id定位3.2. name定位3.3. class定位3.4. tag定位3.5. link定位3.6. partial定位3.7. xpath定位3.8. css定位3.9. find_element的By定位3.10. 多个元素4.1. get_attribute获取属性4.2. 获取文本4.3. 获取其他属性5.1. 输入文本5.2. 点击5.3. 清除文本5.4. 回车确认5.5. 单选5.6. 多选5.7. 下拉框6.1. Frame切换6.2. 选项卡切换7.1. 左键7.2. 右键7.3. 双击7.4. 拖拽7.5. 悬停9.1. 强制等待9.2. 隐式等待9.3. 显式等待10.1. 运行Javascript,使用execute_script10.2. COOKIE10.3. 反屏蔽10.4.其他

 

0. 准备工作

 

在开始后续功能演示之前,我们需要先安装Chrome浏览器并配置好ChromeDriver,当然也需要安装selenium库!


0.1. 安装selenium库

Chrome浏览器哈

*手动安装*

先查看本地Chrome浏览器版本:(两种方式均可)



  • 在浏览器的地址栏键入Chrome://version,即可查看浏览器版本号图片



  • 或者点击Chrome菜单 帮助关于Google Chrome,查看浏览器版本号图片



再选择对应版本号的驱动版本


下载地址:https://chromedriver.storage.googleapis.com/index.html


最后进行环境变量配置,也就是将对应的ChromeDriver的可执行文件chromedriver.exe文件拖到PythonScripts目录下。

注:当然也可以不这样做,但是在调用的时候指定chromedriver.exe绝对路径亦可。

*自动安装*

自动安装需要用到第三方库webdriver_manager,先安装这个库,然后调用对应的方法即可。

ChromeDriverManager().install()方法就是自动安装驱动的操作,它会自动获取当前浏览器的版本并去下载对应的驱动到本地。

browser对象,接下来我们就可以调用browser来执行各种方法模拟浏览器的操作了。


1.2. 访问页面

进行页面访问使用的是get方法,传入参数为待访问页面的URL地址即可。

set_window_size()方法可以用来设置浏览器大小(就是分辨率),而maximize_window则是设置浏览器为全屏!

refresh()方法可以用来进行浏览器页面刷新。

F5快捷键。


1.5. 前进后退

前进后退也是我们在使用浏览器时非常常见的操作,这里forward()方法可以用来实现前进,back()可以用来实现后退。

selenium打开某个页面,有一些基础属性如网页标题、网址、浏览器名称、页面源码等信息。

正则表达式Bs4xpath以及pyquery等工具进行解析提取想要的信息了。

 

3. 定位页面元素

 

我们在实际使用浏览器的时候,很重要的操作有输入文本、点击确定等等。对此,Selenium提供了一系列的方法来方便我们实现以上操作。常说的8种定位页面元素的操作方式,我们一一演示一下!

我们以百度首页的搜索框节点为例,搜索python

图片搜索框

搜索框的html结构:

HTML是通过tag来定义功能的,比如input是输入,table是表格等等。每个元素其实就是一个tag,一个tag往往用来定义一类功能,我们查看百度首页的html代码,可以看到有很多同类tag,所以其实很难通过tag去区分不同的元素。

input,以上代码会报错。


3.5. link定位

这种方法顾名思义就是用来定位文本链接的,比如百度首页上方的分类模块链接。

idnameclass超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。

但是在实际工作中并非有这么美好,那么这个时候我们就只能通过xpath或者css来定位了。

xpath要简洁些,定位速度也要快些。

8种定位方法,Selenium还提供了一个通用的方法find_element(),这个方法有两个参数:定位方式和定位值。

find_elements,得到的结果会是列表形式。简单来说,就是element后面多了复数标识s,其他操作一致。

 

4. 获取页面元素属性

 

既然我们有很多方式来定位页面的元素,那么接下来就可以考虑获取以下元素的属性了,尤其是用Selenium进行网络爬虫的时候。


4.1. get_attribute获取属性

以百度首页的logo为例,获取logo相关属性

图片

text属性,直接调用即可

python,然后回车就出查询操作结果的情况。

Select模块。

先导入该类

select模块中有以下定位方法


Selenium打开一个页面之后,默认是在父页面进行操作,此时如果这个页面还有子页面,想要获取子页面的节点元素信息则需要切换到子页面进行擦走,这时候switch_to.frame()就来了。如果想回到父页面,用switch_to.parent_frame()即可。


6.2. 选项卡切换

我们在访问网页的时候会打开很多个页面,在Selenium中提供了一些方法方便我们对这些页面进行操作。


current_window_handle:获取当前窗口的句柄。

window_handles:返回当前浏览器的所有窗口的句柄。

switch_to_window():用于切换到对应的窗口。


ActionChains 类。

click()操作。


7.2. 右键

ActionChains(browser):调用ActionChains()类,并将浏览器驱动browser作为参数传入

context_click(right_click):模拟鼠标双击,需要传入指定元素定位作为参数

perform():执行ActionChains()中储存的所有操作,可以看做是执行之前一系列的操作



7.3. 双击

drag_and_drop(source,target)拖拽操作嘛,开始位置和结束位置需要被指定,这个常用于滑块类验证码的操作之类。

我们以菜鸟教程的一个案例来进行演示


https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable


selenium中的Keys()类提供了大部分的键盘操作方法,通过send_keys()方法来模拟键盘上的按键。

引入Keys

send_keys(Keys.BACK_SPACE):删除键(BackSpace)

send_keys(Keys.SPACE):空格键(Space)

send_keys(Keys.TAB):制表键(TAB)

send_keys(Keys.ESCAPE):回退键(ESCAPE)

send_keys(Keys.ENTER):回车键(ENTER)

send_keys(Keys.CONTRL,'a'):全选(Ctrl+A)

send_keys(Keys.CONTRL,'c'):复制(Ctrl+C)

send_keys(Keys.CONTRL,'x'):剪切(Ctrl+X)

send_keys(Keys.CONTRL,'v'):粘贴(Ctrl+V)

send_keys(Keys.F1):键盘F1

.....

send_keys(Keys.F12):键盘F12


实例操作演示:

定位需要操作的元素,然后操作即可!

ajax加载的网页,页面元素可能不是同时加载出来的,这个时候尝试在get方法执行完成时获取网页源代码可能并非浏览器完全加载完成的页面。所以,这种情况下需要设置延时等待一定时间,确保全部节点都加载出来。

三种方式可以来玩玩:强制等待、隐式等待和显式等待


9.1. 强制等待

就很简单了,直接time.sleep(n)强制等待n秒,在执行get方法之后执行。


9.2. 隐式等待

implicitly_wait()设置等待时间,如果到时间有元素节点没有加载出来,就会抛出异常。

driver: 浏览器驱动

timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)

poll_frequency: 每次检测的间隔时间,默认是0.5秒

ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常

 

until(method,message='')

method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False

message: 如果超时,抛出TimeoutException,将message传入异常

 

until_not(method,message='')

until_notuntil相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。


其他等待条件

Javascript,使用execute_script方法来实现。

selenium使用过程中,还可以很方便对COOKIE进行获取、添加与删除等操作。

Selenium给屏蔽了,不知道怎么搞!!

使用mitmproxy

import re  
from mitmproxy import ctx  


def response(flow):  

  """修改应答数据"""  

  if '/js/yoda.' in flow.request.url:  

      # 屏蔽selenium检测  

      for webdriver_key in [ 'webdriver', '__driver_evaluate', '__webdriver_evaluate', '__selenium_evaluate', '__fxdriver_evaluate', '__driver_unwrapped', '__webdriver_unwrapped', '__selenium_unwrapped', '__fxdriver_unwrapped', '_Selenium_IDE_Recorder', '_selenium', 'calledSelenium', '_WEBDRIVER_ELEM_CACHE', 'ChromeDriverw', 'driver-evaluate', 'webdriver-evaluate', 'selenium-evaluate', 'webdriverCommand', 'webdriver-evaluate-response', '__webdriverFunc', '__webdriver_script_fn', '__$webdriverAsyncExecutor', '__lastWatirAlert', '__lastWatirConfirm', '__lastWatirPrompt', '$chrome_asyncScriptInfo', '$cdc_asdjflasutopfhvcZLmcfl_']:  

        ctx.log.info( 'Remove "{}" from {}.'.format(webdriver_key, flow.request.url))  

        flow.response.text = flow.response.text.replace( '"{}"'.format(webdriver_key), '"NO-SUCH-ATTR"')  

    flow.response.text = flow.response.text.replace( 't.webdriver', 'false')  

    flow.response.text = flow.response.text.replace( 'ChromeDriver', '')  

10.4. 其他

除了上述操作外,还有许多其他操作,遇到了就现场搜吧!如切换到弹出框等。

 

 



推荐阅读
  • 如何清除Chrome浏览器地址栏的特定历史记录
    在使用Chrome浏览器时,你可能会发现地址栏保存了大量浏览记录。有时你可能希望删除某些特定的历史记录而不影响其他数据。本文将详细介绍如何单独删除地址栏中的特定记录以及批量清除所有历史记录的方法。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 本文介绍了使用不同工具和方法来查看设置了密码保护的易语言源码的方法。不仅限于特定浏览器,还提供了使用Chrome等主流浏览器的解决方案。 ... [详细]
  • 探讨了在 Spring MVC 框架下,JSP 页面使用 标签时遇到的数据无法正确显示的问题,并提供了可能的原因和解决方案。 ... [详细]
  • 本文详细探讨了JavaScript中四种获取CSS样式的不同方法:style、currentStyle、getComputedStyle和getBoundingClientRect。每种方法的适用场景及其兼容性问题,并提供了解决方案。 ... [详细]
  • AngularJS在IE7中的兼容性解决方案
    本文探讨了在较旧版本的Internet Explorer(如IE7)中使用AngularJS时遇到的问题及解决方法,包括HTML标签的正确书写方式以及如何添加对JSON的支持。 ... [详细]
  • 2015款Chromebook Pixel评测:高端Chrome OS笔记本体验
    在笔记本电脑领域,Chromebook Pixel凭借其精致的铝合金外壳、细腻的显示屏和舒适的键盘,成为了外观设计的佼佼者。然而,尽管外观出众,它是否值得购买仍需考量。 ... [详细]
  • 本文介绍如何确保浏览器驱动与浏览器版本兼容,并详细说明在成功调用浏览器后如何创建和管理Session。同时,提供了一些常用的Selenium定位元素的方法。 ... [详细]
  • 本文介绍了如何利用Selenium和Python通过执行JavaScript代码来控制网页中的滚动条,包括垂直和水平滚动条的控制,以及特定元素的聚焦技术。 ... [详细]
  • Web App vs Native App:未来的移动应用趋势
    随着移动互联网的发展,Web App和Native App之间的竞争日益激烈。对于开发者而言,选择哪一种技术路径更为明智?本文将深入探讨两种应用模式的特点及未来趋势。 ... [详细]
  • 利用CSS3和React实现数字滚动动画组件
    在前端开发中,数字滚动动画是一个常见的需求。本文将详细介绍如何使用CSS3和React构建一个数字滚动动画组件,包括组件的代码实现和样式设计。如果您对HTML版本感兴趣,欢迎留言获取。 ... [详细]
  • Vue项目中应用骨架屏实践
    在当前开发的项目中,由于登录过程涉及多次重定向,导致用户体验不佳。为了改善这一状况,本文介绍了如何使用vue-skeleton-webpack-plugin插件在Vue项目中实现骨架屏,以减少用户感受到的白屏时间。 ... [详细]
  • 如何安装Google访问辅助插件
    在许多地区,直接访问Google可能受到限制。不过,通过使用特定的工具如Google访问辅助插件,可以绕过这些限制。本文将详细介绍如何安装这一实用的浏览器插件。 ... [详细]
  • 将基于Web的互动多媒体体验引入手机和平板电脑历来面临诸多挑战,如性能瓶颈、API兼容性和HTML5音频及视频播放限制等问题。本文探讨了如何克服这些障碍,为《霍比特人:史矛革之战》打造了一个移动优先的沉浸式网络体验。 ... [详细]
  • 在开发过程中遇到前端页面显示 404 Not Found 错误时,通常意味着请求的资源无法被服务器找到。本文将探讨这一错误的具体原因及解决方法。 ... [详细]
author-avatar
mc_yang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有