这几天的任务量比较大,还有一个挺棘手的网站cfda,不巧的是数据量还挺大,40W关于企业信息。上来就是debugger pause,调试中断,开始还是挺懵逼的,但这个还算简单毕竟google,百度,就能解决。经过初步的分析,有一个难点,关于跨网页,一个字串,以及cookies是一个网页一变,要解决这个问题,其实就是去读懂js,node 或者自己python实现,虽然是可以实现,但肯定是需要花一些时间的,那不如直接selenium上手搞起来,毕竟能解决问题的方法就是好方法。

  其实,cfda还是挖了一些坑的,在浏览器检测机制,因为一直用chrome比较顺手,也就用chromedriver比较多一点,这下一上来就奇怪了,点击之后返回数据为空,这明显是被发现了。但又是哪里暴露了呢?

browser.find_element_by_css_selector("#content table a:nth-child(1)").click()

  直接点击既然不行,那么会不会是需要鼠标悬停,然后再点击。那么就祭出原生js,考验我js功底的时候到了

go_detail_js = "var div=document.getElementById('content');" \
"var c=div.getElementsByTagName('a')[1].click();"
browser.execute_script(go_detail_js)

  这里复习一遍原生js选择元素的语法

document.getElementById("domId")
document.getElementsByName("domName")
document.getElementsByTagName("tagName")
document.getElementsByClassName("classNames")

  然而实际上问题并不是出在鼠标点击事件上面。。。。而是检测到了chromedriver,于是使用FireFox解决了这个问题。

  但最大的收获点不是这个,因为可利用的资源要尽可能的利用起来,与我们公司的前端讨论了一下这个问题,前端给出了一种更激动人心的写法,以至于我都不需要去写查找元素的js代码。只需要去寻找传递数据的js函数即可

go_page_js = 'location.href="javascript:devPage(%s)";' % page

return_list_js = 'location.href = "javascript:viewList();"'

browser.execute_script(go_page_js)

  本身在浏览器控制台即可执行这些语句,果然前端教做人,毕竟使坏的都是这些前端啊。

还有一些注意点就是time.sleep需要等待页面加载完成后,才能获取page_source,以及异常处理,毕竟直接在浏览器上运行这些js代码,天有不测风云,总有出错的时候,这里需要在遇上这些情况的时候加上那么一句browser.refresh().

  这样就万事大吉了,速度嘛,肯定比requests慢点,但是多进程就可以解决这个问题。

  

selenium js的更多相关文章

  1. selenium—JS点击方法

    package com.allin.pc;import java.util.NoSuchElementException;import org.openqa.selenium.By;import or ...

  2. python + selenium + Js 处理轮动条

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候需要借 ...

  3. python+selenium+js 处理滚动条

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候需要借 ...

  4. selenium - js日历控件处理

    # 13. js处理日历控件 ''' 在web自动化的工程中,日历控制大约分为两种: 1. 可以直接输入日期 2. 通过日历控件选择日期 基本思路: 利用js去掉readonly属性,然后直接输入时间 ...

  5. selenium - Js处理滚动条操作

    # 11.Js处理滚动条操作 driver.execute_script('arguments[0].scrollIntoView();',target) target 为find_element_b ...

  6. Java&Selenium&JS&AWT之那些难以点击到的按钮

    一.摘要 本篇博文的重点并不是简单的click()方法,而是要讲的是那些click()方法失效的时候的处理方式,其实做自动化久了我们都能发现研发的代码并不是都那么美丽,selenium支持的8种定位方 ...

  7. selenium + js 处理窗口

    1.隐藏页面的广告窗口 document.getElementById("top_left").style.display="none"; 2.隐藏控件点击 d ...

  8. Python+Selenium - js操作

    js操作:日期框 本部分涉及两个知识点:DOM树和js DOM树教程链接: https://www.w3school.com.cn/htmldom/index.asp js教程链接 https://w ...

  9. JavaScript(Node.js)+ Selenium 实现淘宝抢单

    JavaScript(Node.js)+ Selenium 淘宝抢单 为了买买买我也是拼了,看了一点selenium的资料,随便写的. 程序写的比较烂,但是够我自己用了,望各路大牛指教. 使用说明: ...

随机推荐

  1. rem移动端适配方案

    一. rem vs em 单位 定义 特点 rem font size of the root element 以根元素字体大小为基准 em font size of the element 以父元素 ...

  2. SQLServer数据库分页

    以  项目表 PM_Project  为例. PM_Project 全部内容如下(共6条数据): 一.Top – Not In - Top 方式分页 直接的,原始的,不采用函数,纯手动挡. 分步探索过 ...

  3. CMake--变量

    1.一般变量 1)CMake变量引用的方式 使用${}进行变量的引用.例如: ${PROJECT_NAME} #返回项目名称 在 IF 等语句中,是直接使用变量名而不通过${}取值. 2)cmake自 ...

  4. zTree树形菜单使用实例

    在每个节点添加 id 和 pid, id 表示当前节点编号,pid 表示父节点编号 第一步:在页面显示菜单位置,添加 ul设置 class=”ztree” 第二步:开启简单数据格式支持 第三步:编写树 ...

  5. Django的模板层

    一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

  6. include与__autoload与命名空间namespace与PSR4详解

    1. include, require, include_once, require_once include和require是PHP中引入源文件最基本的用法,其他例如__autoload, name ...

  7. 如何在mac下安装php

    步骤如下: 1.下载php源码并解压 2.进入php源码并configure 3.安装openssl 4.sudo make及make test 5.sudo make install 具体命令如下: ...

  8. 转载 -- jquery easyui datagrid 动态表头 + 嵌套对象属性展示

    代码功能: 1.datagrid 的表头由后台生成,可以配置在数据库 2.datagrid 的列绑定数据 支撑嵌套对象 $(function() { var columns = new Array() ...

  9. 安装mysql zip5.7版--安裝

    一直以来都习惯了使用MySQL安装文件(.exe),今天下载了一个.zip版本的MySQL,安装过程中遇到了一些问题,如下: 1.在MySQL官网上(http://dev.mysql.com/down ...

  10. easy install 与pip

    easy_insall的作用和perl中的cpan, ruby中的gem类似,都提供了在线一键安装模块的傻瓜方便方式,而pip是easy_install的改进版, 提供更好的提示信息,删除packag ...