[本文出自天外归云的博客园]

问题

最近在网上搜到了一些练习题,改编了一下这里的20题如下:登陆中国联通网上营业厅 后选择「自助服务」-->「查询」-->「账户余额」,然后输出手机号码和可用额度。

思路

1. 通过抓包模拟接口请求的方式和一些爬网的相关方法解决;

2. 通过selenium进行一些web自动化操作解决。

编写脚本

这里选择了第二种用selenium的方法来解决,脚本如下:

# -*- coding: utf-8 -*-
from selenium import webdriver
import selenium.webdriver.support.ui as ui def login_query_10010(username,pwd):
driver = webdriver.PhantomJS()
driver.get("http://iservice.10010.com/e4/")
wait = ui.WebDriverWait(driver, 10)
login_frame = driver.find_element_by_xpath("html/body/div[5]/div[1]/iframe")
driver.switch_to_frame(login_frame);
wait.until(lambda dr: dr.find_element_by_id('userName').is_displayed())
driver.find_element_by_id("userName").send_keys(username)
driver.find_element_by_id("userPwd").send_keys(pwd)
driver.find_element_by_id("login1").click()
driver.switch_to_default_content()
wait.until(lambda dr: dr.find_element_by_id('menu_query').is_displayed())
driver.find_element_by_id("menu_query").click()
wait.until(lambda dr: dr.find_element_by_id('').is_displayed())
driver.find_element_by_id("").click()
wait.until(lambda dr: dr.find_element_by_xpath(".//*[@id='loadPage']/iframe").is_displayed())
account_info_frame = driver.find_element_by_xpath(".//*[@id='loadPage']/iframe")
driver.switch_to_frame(account_info_frame);
wait.until(lambda dr: dr.find_element_by_id('userInfoContent').is_displayed())
wait.until(lambda dr: dr.find_element_by_xpath(".//*[@id='userInfoContent']/dl[3]/dd").is_displayed())
phone_number = driver.find_element_by_xpath(".//*[@id='userInfoContent']/dl[3]/dd").text
print(u"电话号:"+phone_number)
wait.until(lambda dr: dr.find_element_by_xpath(".//*[@id='userInfoContent']/dl[4]/dd").is_displayed())
available_amount = driver.find_element_by_xpath(".//*[@id='userInfoContent']/dl[4]/dd").text
print(u"可用预存款:"+available_amount) if __name__ == '__main__':
login_query_10010("用户名","密码")

运行结果如下(脚本中用户名和密码为需替换的部分):

总结

总结一下遇到的一些经验点:

1. 通过phantomjs无界面浏览器可以实现无界面化web自动化访问;

2. 如果一个元素定位不到,要看看这个元素是否嵌在iframe元素中,这里用到了selenium定位页面元素之iframe元素的切换;

3. 确定页面元素可访问之后,如果还找不到定位的元素,可能是没有加载完成,需要进行一定时间的等待,这里用到了“wait.until”方法;

4. 定位页面元素可以用过id和一些属性,如果没有明显属性可以用来定位则可以考虑用xpath来定位,这里用到了firefox的一些xpath插件来辅助显示页面元素的xpath路径:

 

Selenium查询10010账户余额——python篇的更多相关文章

  1. C++混合编程之idlcpp教程Python篇(9)

    上一篇在这 C++混合编程之idlcpp教程Python篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTu ...

  2. C++混合编程之idlcpp教程Python篇(8)

    上一篇在这 C++混合编程之idlcpp教程Python篇(7) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial6中,同样加入了四个文件:Pyt ...

  3. C++混合编程之idlcpp教程Python篇(7)

    上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同 ...

  4. C++混合编程之idlcpp教程Python篇(6)

    上一篇在这 C++混合编程之idlcpp教程Python篇(5) 第一篇在这 C++混合编程之idlcpp教程(一) 工程PythonTutorial4中加入了四个文件:PythonTutorial4 ...

  5. C++混合编程之idlcpp教程Python篇(5)

    上一篇在这  C++混合编程之idlcpp教程Python篇(4) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial3中,同样加入了三个文件:Py ...

  6. C++混合编程之idlcpp教程Python篇(4)

    上一篇在这 C++混合编程之idlcpp教程Python篇(3) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相似,工程PythonTutorial2中,同样加入了三个文件 Pyt ...

  7. C++混合编程之idlcpp教程Python篇(3)

    上一篇 C++混合编程之idlcpp教程Python篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与PythonTutorial0相似,工程Pyth ...

  8. Noah的学习笔记之Python篇:命令行解析

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  9. Noah的学习笔记之Python篇:函数“可变长参数”

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

随机推荐

  1. idea 不下载jar包

    是因为用的gradle 然后没有设置gradle jvm

  2. ROS学习(十二)—— 编写简单的消息发布器和订阅器(C++)

    一.创建发布器节点 1 节点功能: 不断的在ROS网络中广播消息 2 创建节点 (1)打开工作空间目录 cd ~/catkin_ws/src/beginner_tutorials 创建一个发布器节点( ...

  3. POJ 2676 Sudoku (DFS)

    Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11694   Accepted: 5812   Special ...

  4. 【Struts2】Struts2与Spring整合后,如何指定Action为多例模式

    Strust2默认是多例的,但是Spring默认是单例的,在进行Spring+Strust2整合的时候,就需要把Spring管理的action指定为多例模式,只需要在action上面加上@Scope( ...

  5. 使用Cordova搭建Andoid和iOS开发环境

    最近在了解cordova  ,下面的分享出来  大家可以看看,  我 有空也按照这个写写demo 1.下载node.js,进行安装 https://nodejs.org/en/ 2.安装cordova ...

  6. iOS中的copy

    原文:http://www.jianshu.com/p/5254f1277dba 内存的栈区 : 由编译器自动分配释放, 存放函数的参数值, 局部变量的值等. 其操作方式类似于数据结构中的栈. 内存的 ...

  7. mongoDB 32位 安装包地址

    https://www.mongodb.org/dl/win32/i386 http://downloads.mongodb.org/win32/mongodb-win32-i386-3.2.4-si ...

  8. 面向对象的Shell脚本

    还记得以前那个用算素数的正则表达式吗?编程这个世界太有趣了,总是能看到一些即别出心裁的东西.你有没有想过在写Shell脚本的时候可以把你的变量和函数放到一个类中?不要以为这不可能,这不,我在网上又看到 ...

  9. linux卸载自带jdk

    centos 6.5系统 java -version: rpm -qa | grep jdk rpm -qa | grep gcj: 使用: yum -y remove java-1.5.0-gcj- ...

  10. Linux下查找指定日期的文件

    一.背景 Linux服务器的一个目录里,每天产生海量的文件.为了防止磁盘被写满. 决定每天删除部分老文件.OK,问题来了,如何过滤出指定日期的文件? 二.强大的Linux 一行代码搞定: ls --f ...