本文由博主(SunboyL)原创,转载请注明出处:https://www.cnblogs.com/SunboyL/p/11563345.html

  因为工作原因,需要将xls文件的数据录入到网上。因为数据量太多,而且以后时不时还需要用上,Ctrl+C,Ctrl+V不是长久之计。所以萌生一个想法,写一个工具,用于把xls文件的数据录入到网站上

  笔者这段时间才刚刚开始了解HTML、JavaScript,很多东西都是刚刚初步有点认识。写的比较详细,如果你跟我一样,相信文章对你很有用。如果是老鸟,那就跳过吧~

  读写xls部分省略。

  要实现填写表单,需要:

  1.python的selenium库。系统了解selenium,请到:http://www.testclass.net/selenium_python

  2.Chrome浏览器,也可以使用其他浏览器,参考:http://www.testclass.net/selenium_python/selenium3-browser-driver

  3.与谷歌浏览器版本对应的chromedriver,下载地址:https://sites.google.com/a/chromium.org/chromedriver/home,打不开就用taobao备用地址:http://npm.taobao.org/mirrors/chromedriver/

一、配置chromedriver

  1)先查看自身Chrome浏览器的版本号,再到chromedriver下载网站找到与自身Chrome浏览器匹配的chromedriver版本下载使用。笔者下载的是win32版本,详细步骤如图:

  2)下载后解压,并把chromedriver.exe拷贝到Chrome浏览器所在目录,详细步骤如图所示:

  

  3)为了方便,我们也可以把Chrome路径添加到系统环境变量中:

  

  到此,chromedriver就配置完毕啦。

二、Python安装selenium库

  使用如下命令即可完成安装:

  

pip3 install selenium

  如图:

  

三、测试selenium库使用

  编辑如下代码,实现打开百度页面并搜索“cnblogs”的简单功能(后续讲解代码中id的来源):

import os
from selenium import webdriver def test():
driver = webdriver.Chrome("chromedriver.exe") # chromedriver所在路径
driver.get(r"http://www.baidu.com") driver.find_element_by_id("kw").send_keys("cnblogs") # 输入cnblogs
driver.find_element_by_id("su").click() # 点击“百度一下”搜索 if __name__ == "__main__":
test()
os.system("pause")

  

  测试完成,接下来就可以使用了。

  

  

四、selenium的使用

  selenium提供了多种定位网页元素的方法,如通过id、name、classname、xpath等多种方式。详细请参考:http://www.testclass.net/selenium_python/find-element/,这里就不一一赘述了。

  到此,我们就已经几乎做好填写表单的所有准备啦,最后一步,就是定位我们的目标网站的具体元素并实现填表了。

五、定位网页元素

  chrome开发者工具为我们提供了非常遍历的方式定位网页元素。我们以定位百度首页的文本输入框以及“百度一下”按钮为例:

  1、打开Chrome浏览器,按F12打开开发者工具。点击进入“Elements”板块,我们就能看到网页完整的HTML代码。如图:

  

  2.点击开发者工具左上角的小按钮来定位页面元素,我们定位文本输入框找到输入框对应的元素id,当然,我们也可以通过其他值来定位,如图:

  接下来我们定位百度按钮:

    

  从这里我们看到,文本输入框的id是“kw”,百度一下按钮的id是su,有了如上信息,我们就可以写出第三大点的代码了。

六、实践中遇到的一些问题:处理批量填表时抛出异常:selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted

  对于批量数据的填写,常常需要我们点击按钮增加填写区域。如下图示例

  

  通过Chrome开发者工具,我们定位到该按钮元素,三个按钮属于同一个类,class=“addbutton”:

  

  假设我们已经定位到改行元素row_element,接下来我们就开始实现代码吧:

  1)第一版代码

    我们通过row_element定位到第二个addbutton按钮并点击,代码如下:

  

  通过以上方式,我们实现了自动添加一行填表区域的逻辑。

  但是事与愿违,当我用这种方式批量填表时,填表途中抛出了异常:

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <input type="button" tabindex="-1" class="addbutton" value="+↓" onclick="postInsert(11)"> is not clickable at point (737, 833). Other element would receive the click: <iframe frameborder="0" name="hiddenwin" id="hiddenwin" class="debugwin"></iframe>
(Session info: chrome=77.0.3865.90)

  

  大概意思就是被其他元素拦截了。只能再找新的办法。

  各种查资料,结果就出现了第二版代码。

  2)第二版代码

  将第一版代码稍作修改,使用JavaScript脚本执行,如图:

  

  

print("添加一条填表区...")
add_buttons = row_element.find_elements_by_class_name('addbutton')
# add_buttons[1].click()
driver.execute_script("arguments[0].click()", add_buttons[1])

  经过修改,再也没有出现刚刚的报错了~

  3)第三版代码,进一步改进

  随着自己对JavaScript和HTLM的进一步熟悉,重新看了一下发现自己绕了个大弯,其实完全有更简单的方法实现。

  笔者原本的逻辑,是通过各种方式定位到了该行元素,再定位到具体按钮,进而使用click()实现。

  但是我们回头看一下HTLM源码,如下:

  

  

  我们可以看到,其实click事件就是响应了一个postInsert()函数

  我们直接使用driver.execute_script()调用postInsert()函数就可以了,完全不需要定位元素位置呀,不!需要!定位!呀!呀!

  postInsert()函数接受一个整型值,代表在第几行的后面插入新行。对代码稍作修改,就有了第三版代码,一行就搞定了:

  

至此,工具就写完了,笔者这几天是从0基础了解HTML、JavaScript开始,一步一步加深认识,并把工具写好,碰到的坑,数不尽数。但是收获也很大,继续加油吧!

  

Windows下使用python3 + selenium实现网页自动填表功能的更多相关文章

  1. Windows下安装Python3.4.2

    一.Windows下安装Python3.4.2 1.下载Windows下的Python3.4.2.exe 2.指定一个目录安装,然后下一步 3.配置环境变量包括Python.exe的文件.目录如下图所 ...

  2. 环境搭建文档——Windows下的Python3环境搭建

    前言 背景介绍: 自己用Python开发了一些安卓性能自动化测试的脚本, 但是想要运行这些脚本的话, 本地需要Python的环境. 测试组的同事基本都没有安装Python环境, 于是乎, 我就想直接在 ...

  3. Python3 Selenium WebDriver网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作

    Python3 Selenium WebDriver网页的前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 通过selenium webdr ...

  4. Windows下nginx的启动,重启,关闭功能

    @echo off rem 提供Windows下nginx的启动,重启,关闭功能 echo ==================begin======================== cls :: ...

  5. windows下不打开浏览器访问网页的方法

    我们打开电脑,大多时候都是打开浏览器在上网.这都是通过浏览器来实现的,然而windows下有没有办法不通过浏览器也可以像linux那样达到访问网页的目的呢?这当然少不了批处理或者VBScript.然而 ...

  6. 全网最全的Windows下Python2 / Python3里正确下载安装用来向微信好友发送消息的itchat库(图文详解)

    不多说,直接上干货! 建议,你用Anaconda2或Anaconda3. 见 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装用来向微信好友发送消息的itchat库( ...

  7. Windows下升级Python3.7.7后(原Python3.6.2版本)如何切换Python版本

    笔者:风起怨江南 出处:https://www.cnblogs.com/mengjinxiang 笔者原创,文章欢迎转载,如果喜欢请点赞+关注,谢谢! 问题:window系统下,如果升级了最新的Pyt ...

  8. C# 网页自动填表自动登录(转)

    自动填表的方式有很多,关键是获取控件的id或者name. 比如源代码有 <input id="pwdInput" tabindex="2" class=& ...

  9. windows下python环境+selenium环境搭建

    一.安装Python 1. 下载python包,最新版本的上一个版本:https://www.python.org/downloads/windows/ 2. 安装 可选择默认安装或自定义安装,自定义 ...

随机推荐

  1. 小油2018 win7旗舰版64位GHOST版的,安装telnet客户端时,提示:出现错误。并非所有的功能被成功更改。

    win7旗舰版64位GHOST版的,安装telnet客户端时,提示:出现错误.并非所有的功能被成功更改. 从安装成功的电脑上拷贝ghost版本缺少的文件,然后再安装telnet客户端,我已打包 链接: ...

  2. 锋利的jQuery 要点归纳(一) jQuery选择器

    1 基本选择器 $(#id)    根据给定的id匹配一个元素$(.class)    根据给定的类名匹配元素$(element)    根据给定的元素名匹配元素$(*)    匹配所有元素$(sel ...

  3. P1969积木大赛

    这是2018与2013提高组的真题,可怕,,原题出了两年,是个纯模拟. 读完题后就想写一个朴素的模拟,先遍历层数,再把达到层数的宽度#存起来,再判断是否连续,如果不连续ans++,然后每一次循环都要初 ...

  4. 0ctf 2017 kernel pwn knote write up

    UAF due to using hlist_add_behind() without checking. There is a pair locker(mutex_lock) at delete_n ...

  5. 字符串hash 模板

    typedef long long ll; typedef unsigned long long ull; #define maxn 1005 struct My_Hash { ull ; ull p ...

  6. GeoAdapter实现WMS、WMTS、ArcGIS MapService的区域权限授权管理

    背景: 在实际GIS应用中,我们经常会发布GIS地图服务,然后供WebGIS调用.在某些特殊情况下,需要对服务进行区域授权,特定的用户只能够浏览特定范围内的地图数据.通常情况下大家采用的实现方式是使用 ...

  7. 使用英特尔® 驱动程序和支持助理更新英特尔®固态盘数据中心工具(英特尔®固态盘 DCT)后仍旧提示更新

    再regedit中搜索原始版本,位于计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{82F015 ...

  8. Hadoop本地模式搭建

    官方文档,不同版本修改url地址中的数字即可 http://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/Single ...

  9. HTTP1.0、HTTP 1.1、HTTP 2.0之间的主要区别

    HTTP1.0与HTTP 1.1的主要区别  长连接 节约带宽 HOST域 HTTP1.1与HTTP 2.0的主要区别  多路复用 二进制分帧 首部压缩 服务器推送 一.HTTP1.0与HTTP 1. ...

  10. vue.js table组件封装

    table组件 和 分页组件来自iview,在这里我根据公司业务再次做了一次封装,使用slot进行内容分发,可以随意放置input输入框和button按钮 ,再使用props向子组件传递参数,使用em ...