pythonselenium(pythonSelenium元素拖拽)

http://www.itjxue.com  2023-03-27 12:22  来源:未知  点击次数: 

使用python简单封装selenium常用函数

年前走查脚本代码时,发现大家对selenium功能都在重复造轮子,而且容易出现一些常见低级bug。于是在闲暇之余,封装一些常用的selenium功能。

在某些网页中,存在多个frame嵌套。而selenium提供的find_element函数只能在当前frame中查找,不能切换到其他frame中,需要从最上级frame中逐步切换(当然也可以指定xpath的绝对路径,但是一般没人这么做)。在我们写代码过程中,需要明确知道当前frame位置和需要寻找元素的frame位置。在frame切换过程中,容易因为疏忽导致frame切换错误导致元素无法找到的bug。

页面中分布的frame,可以理解为树状结构。因此我们可以采用递归的方式, 沿着某条搜索路线frame节点,依次对树中每个节点均做一次访问。

我们以163网址上的登录框为例:点击登录按钮,弹出登录iframe页面。输入框位置在iframe中,因此我们不能使用xpath获取元素位置,需要进入iframe中,然后获取元素。

手动切换ifame可能会产生bug,因此需要一套自动切换和检索frame的机制。具体代码如下:

需要注意的是:如果页面中多个frame中,存在相同的xpath元素。还是需要指定frame的路径,否则会返回搜索到的第一个元素。

强制等待

直接调用系统time.sleep函数,不管页面加载情况一定会等待指定的时间, 即使元素已被加载 。

1.如果设置的时间较长,会浪费时间

2.如果设置的时间较短,元素可能没有加载。

页面中某元素如果未能立即加载,隐式等待告诉WebDriver需等待一定的时间,然后去查找元素。默认不等待,隐式等待作用于整个WebDriver周期,只需设置一次即可。

1.在上文的find_element函数中,采用递归方式在所有frame寻找元素。若采用隐式等待,则在每个frame中都需要等待设定的时间,耗时非常长。

2.某些页面我们想要的元素已经加载完毕,但是部分其他资源未加载。隐式等待必须等待所有元素加载完毕,增加额外等待时间。

显示等待一般作用于某一个元素,在设定的时间范围内,默认每间隔0.5秒查找元素。返回被加载的元素,若超过设定的时间范围未能查找则报错。显示等待作为selenium常用的等待机制,我们来看下他的源码和机制。

driver 注释中解释为WebDriver实例,但是代码中并未有相关检测,因此可以传入任何对象

但是__repr__函数中使用到session_id属性,如果需要显示属性或者转为str对象,最好在driver对象中添加session_id属性

在until函数中,我们可以看到driver对象传入method函数。在计时结束前,在不断循环执行method函数,如果method函数有正常返回值则退出循环,否则报TimeoutException错误。

可以采用装饰器对隐式等待进行封装,这样代码更加精简

同样的,采用装饰器对其他常用的函数进行封装,例如强制等待、点击、输入文本等。

装饰器虽然很方便,但也会产生一些麻烦。例如在find_element函数递归调用过程中,理应只要执行一次装饰器函数。但因为装饰器已经装饰完毕,导致每次递归都会执行。例如强制等待的sleep函数,如果递归次数越多等待时间越长。

解除装饰器一般有两种做法:一是约定参数,当递归第二次调用时则不生效。例如

这种方式实现简单,容易理解。但是增加了参数限制,在fun函数中就不能使用first_sleep参数。

二是采用装饰器采用wrapped实现,通过访问wrapped属性获得原始函数。例如

但是某一个函数被多个装饰器装饰时,需要递归解除装饰器。例如

最后整体代码如下

这次的封装其实还存在很多问题

1.find_element函数不仅仅只是提供查找元素功能,还提供一些其他功能,因此叫element_operation更为合适。

2.find_element函数的参数过多,并且很多参数的使用并不在函数本身中,对代码阅读很不友好。

3.得小心避免参数重复问题,假设装饰器sleep和装饰器wait_time都使用time这个参数,将无法区分具体是哪个函数使用。

4.不利于扩展和维护,当功能过多时find_element的参数过于庞大。

如果只是简单地封装和使用,上面这种方式也能达到较好的效果。如果想进一步封装,建议采用链式调用方式,装饰器辅助封装。例如

这样函数的扩展性和可阅读性有较大的提升

关于Python的Selenium框架全解,一篇完整的说明书

目录

安装 selenium 第三方库

下载浏览器驱动:

需要把这些浏览器驱动放入 Python 应用目录里面的 Script 文件夹里面

① 200 多本 Python 电子书(和经典的书籍)应该有

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且可靠的练手项目及源码)

④ Python基础入门、爬虫、网络开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

私信我01即可获取大量Python学习资源

每次当selenium启动chrome浏览器的时候,chrome浏览器很干净,没有插件、没有收藏、没有 历史 记录,这是因为selenium在启动chrome时为了保证最快的运行效率,启动了一个裸浏览器,这就是为什么需要配置参数的原因,但是有些时候我们需要的不仅是一个裸浏览器

selenium启动配置参数接收是ChromeOptions类,创建方式如下 :

创建了ChromeOptions类之后就是添加参数,添加参数有几个特定的方法,分别对应添加不同类型的配置项目

常用配置参数:

其他配置项目参数

制作无头浏览器

规避检测

门户网站检测如果是selenium请求的,有可能会拒绝访问。这也是一种反爬机制

实现规避检测

注意:这里只能使用 options 添加

如果有其他的模块要添加,注意要分开添加

元素定位语法

常用语法:

在 element 变成 elements 时,返回符合条件的所有元素组成的数组

控制浏览器大小

浏览器后退,前进

刷新

在搜索框模拟回车操作

在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供

ActionChains 类提供了鼠标操作的常用方法:

语法:

想使用selenium中的键盘事件,首先我们必须导入Keys包,需要注意的是包名称Keys首字母需要大写。Keys类中提供了几乎所有的键盘事件包括组合按键如 Ctrl+A、 Ctrl+C 等

使用语法:

其他事件可以通过查看源码获取

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常

实例:

WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常

语法:

参数:

如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期

案例

语法:

alert 里面的方法

WebDriver操作cookie的方法:

参考链接:

与普通的在headers里添加 {'Cookies':' '} 不一样的是,此方法需要按照cookie的name,value,path,domain格式逐个cookie添加

通过execute_script()方法执行JavaScripts代码来移动滚动条的位置

Python+Selenium 元素获取及使用心得

1、获取输入框再输入信息的时候,发现send_keys会把内容输入到所获取输入框的隔壁框框(比如下一个框),排查一大通后发现,是因为待输入的数据前面包含个空格(这空格在Excel里还看不出来),send_keys方法会连空格也输入进去,元素定位并没有不准,这空格就是输入“跳框”的元凶。

解决的办法是检查待输入的源数据,strip去掉前后的空格。

2、直接定位元素的方法,比如Xpath和CSS Selector虽然方便,但是用多了程序健壮性会变差。想想也是,比如新开的页面里,按钮多一个少一个,或者顺序位置发生变化,元素就选错了,后面肯定就不按剧本走了。

这时候最好按id、class name来获取,如果不唯一,那就遍历循环判断(比如先找到父元素再遍历各个子元素),虽然程序运行效率会降低一些,但是程序跑起来的时候不容易挂。

关于效率问题其实也不用太纠结,我都纯用Selenium了我还在乎啥效率啊(手动狗头)

3、循环判断筛选元素的时候,get_attribute是个好东东,常见的比如text,scr,甚至onclick事件里的字符串都可以用来做判断。但是切记最好放在try里,遍历虽好,找到个空值就直接挂了。

如何在python中使用selenium

1、下载Python2.7版本,默认运行安装即可;

2、安装完成之后,设置Python环境变量C:\Python27(操作步骤: 电脑-属性-高级-环境变量-系统变量中的PATH为:变量值: ;C:\Python27 )

3、在python的官方网站上可以找到SetupTools的下载,解压安装安装即可;

4、当安装SetupTools之后,就可以在python安装目录下看到Script目录,

5、同样在变量中加入 path:C:\Python27\Scripts,

6、打开cmd命令行,将目录切换到C:\Python27\Scripts下,输入命令“easy_install pip“安装pip;

7、安装成功pip之后,执行pip install -U selenium 进行下载安装最新selenium的版本。

python安装selenium时报错CERTIFICATE_VERIFY_FAILED

1.安装python

2.通过python的pip安装selenium

3.安装pycharm

如图,pip安装selenium时,提示没有匹配的版本

通过pip install selenium -vvv查看安装日志,日志如下

日志来看,是访问selenium链接失败,SSL报错

继续搜索错误信息CERTIFICATE_VERIFY_FAILED

好了,找到答案!使用此命令安装即可!!!

pip --trusted-host pypi.python.org install selenium

一波三折,真是要死了,继续搜!

找到病友,哈哈,解决方法就不写了,感谢这位仁兄的分享

python selenium设置浏览器参数

设置浏览器参数

为了避免每次运行程序都打开一个窗口,我们也可以设置无窗口访问,只需添加浏览器参数即可:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

url = ' '

chrome_options = Options()

chrome_options.add_argument('--headless')

chrome_options.add_argument('lang=zh_CN.utf-8')

UserAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'

chrome_options.add_argument('User-Agent=' + UserAgent)

driver = webdriver.Chrome(chrome_options=chrome_options)

driver.maximize_window()

driver.minimize_window()

driver.get(url)

print(driver.title)

常用参数

启动就最大化--start-maximized

指定用户文件夹 User Data 路径,可以把书签这样的用户数据保存在系统分区以外的分区–-user-data-dir=”[PATH]”

指定缓存Cache路径–-disk-cache-dir=“[PATH]” 指定Cache大小,单位Byte–-disk-cache-size=100

隐身模式启动–-incognito

禁用Javascript–-disable-javascript# 禁止加载所有插件,可以增加速度--disable-plugins

禁用JavaScript--disable-javascript

禁用弹出拦截--disable-popup-blocking

禁用插件--disable-plugins

禁用图像--disable-images

设置代理chrome_options.add_argument('--proxy-server=http://{ip}:{port}') #

(责任编辑:IT教学网)

更多

相关windows文章