PAMIE- Python实现IE自动化的模块

<div class="tit">
PAMIE- Python实现IE自动化的模块(附 网易注册代码)</div>
<div class="tit">http://pamie.sourceforge.net/</div>
<div class="tit"><br></div>
<div class="date">2009-08-01 00:45</div>
<div id="blog_text" class="cnt">
<p>PAMIE是一套为Python写的用于Web自动化测试的工具,采用Win32COM的方式操作IE来实现。<br>
pamie是个很好的操作IE的模块<br>
用pamie来操作ie浏览器好方便啊,本来它就是一个IE测试自动化的东西,<br>
这样,用pamie来抓取网页,自动提交表单很容易。</p>
<p>使用:<br>
来测试一个最简单的例子:</p>
<p><br>
from cPAMIE import PAMIE</p>
<p>ie = PAMIE()</p>
<p>ie.navigate("google.com")<br>
ie.textBoxSet('q','python')<br>
ie.buttonClick('btnG')<br>
ie.linkClick('Python Programming Language -- Official Website')<br>
ie.windowChange('Python Programming Language -- Official Website')<br>
ie.windowFind('Python Programming Language -- Official Website')<br>
ie.textBoxSet('q',"Automation")<br>
ie.buttonClick('submit')</p>
<p><br>
直接操作页面上的form元素,访问页面的文本信息,来判断用户登陆是否成功。</p>
<p><br>
pamie中怎样处理中文标题的弹出对话框?<br><a href="http://www.python-forum.org/pythonforum/viewtopic.php?f=17&t=3194">http://www.python-forum.org/pythonforum/viewtopic.php?f=17&t=3194</a>
<br><a href="http://markmail.org/message/u3ojkyj2ns7p3dn3#query:+page:1+mid:5wuwfctervph6tlv+state:results">http://markmail.org/message/u3ojkyj2ns7p3dn3#query:+page:1+mid:5wuwfctervph6tlv+state:results</a>
<br>
python:</p>
<p>import cPAMIE, cModalPopUp, winGuiAuto<br>
import time</p>
<p>ie = cPAMIE.PAMIE()<br>
wga = winGuiAuto</p>
<p># 登录<br>
ie.navigate('D://python//WebDialogTest//1.html')</p>
<p>#启动新的进程,自动点击"取消"<br>
clickCancel = cModalPopUp.handlePopup("Confirm","取消")<br>
clickCancel.popupName = "选择文件"<br>
clickCancel.start()</p>
<p>ie.buttonClick("install")<br>
time.sleep(1)</p>
<p>clickCancel.join() #进程结束</p>
<p>-------------------------------------------------------------------------------------------------------------------------------------</p>
<p>另外一篇介绍:</p>
<p><a href="http://pamie.sourceforge.net/">PAMIE</a>

是一个很有意思的模块。它是一个实现IE自动化的模块。在此之前我使用过ClientCookie这个模块,它可以使用urllib2来通过程序访问页
面,并且很适合在需要cookie支持的环境中。不过,有些web的访问过程并不仅仅是下载文件这样的事情,有时是一系统的动作。PAMIE应该是一个更
直观,更简单的模拟手工输入的过程。不过,局限就是它只支持IE,在某些特殊情况下还是可以的。</p>
<p>使用它的话你需要安装win32all模块。</p>
<p>下面是它的<a href="http://pamie.sourceforge.net/README.html">readme</a>
提供的一个简单示例:</p>
<blockquote style="margin-right: 0px;" dir="ltr">
<p>import cPAMIE</p>
<p>ie= cPAMIE.PAMIE()</p>
<p># Start Script:</p>
<p>ie.Navigate ('http://pamie.sourceforge.net/pamieform.html')<br>
ie.SetTextBox('John','firstname',0)<br>
ie.SetTextBox('Doe','lastname',0)<br>
ie.SetTextBox('1020 State Street','Addline1',0)<br>
ie.SetTextBox('Suite #16','Addline2',0)<br>
ie.SetTextBox('San Mateo','city',0)<br>
ie.SetListBox('CA','state',0)<br>
ie.SetTextBox('90210','zip',0)</p>
<p>ie.ClickButton('Submit',0)</p>
</blockquote>
<p>那
么在我们下载完这个模块之后,它是一个zip包。它没有做成安装模式,可以自行将cPAMIE.py拷贝到python安装目录下的lib子目录中即可。
上面的代码很简单,先导入cPAMIE模块,然后生成一个自动化对象ie。这时我们会看到程序自动打开一个ie窗口,我们的操作可以在这个ie窗口中看
到,执行的部分以黄底显示。</p>
<p>ie.Navigate()用来访问一个链接。<br>
ie.SetTextBox()用来设置一个文本域的值。第一个参数为输入的值,第二个参数为对应的form表格的Input域的名字(这一点需要查看源码才知识),第三个是form的名字(示例为0表示下标)。<br>
ie.SetListBox()用来设置列表框的值。<br>
ie.ClickButton()用来模拟点击按钮。第一个参数是按钮的名字,第二个参数为0表示下标。</p>
<p>在PAMIE主页中写出了一些可用的其它的方法,如ClickLink()。它的第一个参数为链接对应的文本,如果是中文,转成unicode即可。如页面是GB2312,链接源码为:</p>
<blockquote style="margin-right: 0px;" dir="ltr">
<p><a href="http://xxx.com">汉字</a></p>
</blockquote>
<p>调用如下:</p>
<blockquote style="margin-right: 0px;" dir="ltr">
<p>ie.ClickButton(unicode('汉字', 'cp936'))</p>
</blockquote>
<p>在实际运行中可能不需要这样,只要参数是unicode编码即可。</p>
<p>同时如果你查看源码,还可以看到一些其它的方法:</p>
<p>Quit() -- 关闭打开的ie<br>
GoBack() -- 后退<br>
Refresh() -- 刷新</p>
<p>大家有兴趣可以试一试,一边操作一边就可以看到结果,很简单也很方便。</p>
<p>-------------------------------------------------------------------------------------------------------------------------------</p>
<p>第三个文章介绍</p>
<p>简单明了的Python,第三方提供的模块或称组件 module 等 也很简单明了的</p>
<p>下面是 一个 例子所列举的功能较全了 代码加注解...</p>
<p># -*- coding: cp936 -*-<br>
import sys</p>
<p>#我把cPAMIE等 pamie2.0里的所有文件放在了 如下路径的 名为pamie 的文件夹里了 加进sys.path方便import 出所有pamie文件夹里的 模块<br>
#只要能import CPAMIE 这里的例子就可运行了呵呵<br>
sys.path.append(r"F:/Python25/lib/site-packages/pamie")<br>
import cPAMIE</p>
<p>#new 实例<br>
ie= cPAMIE.PAMIE()</p>
<p>#打开目标网页</p>
<p>ie.navigate ('http://pamie.sourceforge.net/pamieform.html')</p>
<p>#注意下面所列的 第一个参数如 fistname 等 都是 网页源代码里的 input name="firstname"<br>
#里找出来的,不能用 网页上看见的黑体字: "First Name:"<br>
#填文本框<br>
ie.textBoxSet('firstname','JustThisName')</p>
<p>ie.textBoxSet('lastname','Iamhere')</p>
<p>#先择下拉菜单:</p>
<p>ie.listBoxSelect('state',"MS")</p>
<p>#方形选择框:</p>
<p>ie.checkBoxSet('cxbx',1) #1 2 3 或 * 号等都是 "勾选"的意思 '' 空字符串代表取消选择</p>
<p>#圆形选择框: 英语是 radio 做过网页设计就容易知道这些元素的命名了<br>
#这里选择 Jazz<br>
ie.radioButtonSet("music","Jazz") # music是这个 选择列表的名字,从网页源代码里找出</p>
<p><br>
#最后提交按钮</p>
<p>print "now 提交按钮,只要再Python解释器里输入下面这句就 提交 了"<br>
#ie.buttonClick("Submit") 用来取代鼠标点击 方便多了</p>
<p>#源代码里是 input type="submit" name="Submit" 所以 第一个参数就是name的值"Submit"<br>
#pamie是共分 大小写的</p>
<p>#ie.buttonClick("Submit")</p>
<p>#IE有自已的特性, 好像用 pamie 打开多个网页,都是加在同一个IE进程里的,不是一个网页一个进程</p>
<p>'''很多网页较复杂,有图片按钮, javaScript按钮 等的... 若是 图片类按钮<br>
用 ie.buttonImageClick("submitRegister")</p>
<p>有些按钮是 鼠标点击后 会执行一个 javascript 来提交内容的 如源代码里内容是:<br>
<input type="image" src="<a href="http://www.sit.com/member/images/register.gif">http://www.sit.com/member/images/register.gif</a>
" width="100" height="54" border="0"<br>
onClick="javascript:submitMe();<br>
就是说 点击 那个 叫做 register.gif的图片会 会执行 javascript:submitMe() 来提交页面...时 可用:</p>
<p>ie.javaScriptExecute("javascript:submitMe()") 来自动提交页面. 这类按钮 鼠标移上去后,IE左下角一般会出现 相应的</p>
<p>javascript:theFunction() 很容易找...</p>
<p>执行 带参数的 javascript function 也是可以的... ie.javaScriptExecute("javascript:submitMe('param')")<br>
也可直接设置一个 网页里元素的值:<br>
例如 网页源文件里 设置了 document.Form.id.value="string" 可用下面语句直接更改</p>
<p>ie.javaScriptExecute("javascript:document.Form.id.value='theValueYouWant'")</p>
<p><br>
另外: pamie2.0 里有个 模块用来处理 简单的 弹出窗口 这类窗口的标题一般为: Microsoft Internet Explorer</p>
<p>import cModalPopUp</p>
<p>a=cModalPopUp.handlePopup('Confirm',"确定") #"第二个参数是 "确定",表示 弹出窗口的按钮上的 文字是 "确定"这二个字</p>
<p>如图:</p>
<div><img class="blogimg" src="http://hiphotos.baidu.com/zipand/mpic/item/b0a809d0b2b575259a50276e.jpg" border="0" alt=""></div>
<p>执行:</p>
<p>a.run() 就可用程序来点击那个"弹出窗口"的"确定"按钮了...<br>
可用多线程程序用一个线程来处理这类窗口就不妨碍主程序了...</p>
<p>另外 一个对 pamie 很有用的 填表类工具 : AiRoboForm.exe</p>
<p></p>
<div> </div>
<p></p>
<div><img class="blogimg" src="http://hiphotos.baidu.com/zipand/mpic/item/fd97833f78d1ffe7838b1337.jpg" border="0" alt=""></div>
<p>安装好这个IE工具栏工具后,就可按一下"保存"如上图的"Save"按钮 保存网页表格,然后 鼠标移到 如上图
"Baidu"处停一点时间就出弹出一个子菜单 选择 "edit" 就可看到 那个页面的 表单的 所有名字了 就不用在 源代码里 辛苦的找那么多的
"第一个参数" 也就是说 不用自已找 文本框和列表框名称等了, 你可在那个打开了的 编缉器里看到所有的 要填的框的
"名字"了的只是显示的全是"小写"了, 需要在源文件里看一下第一个字母是否是大写等...pamie是 区分大小写的
AiRoboForm是不区分大小写的...</p>
<p>pamie2.0也有不足的地方:</p>
<p>下文是一个引自 <a href="http://yinxl.spaces.live.com/blog/cns%214626e4f8c0bfc0bc%21172.entry">http://yinxl.spaces.live.com/blog/cns!4626e4f8c0bfc0bc!172.entry</a>
的 "扩展补丁".</p>
<div>5月14日</div>
<h4 class="beTitle">让PAMIE能轻松控制一个新开的IE窗口</h4>
<div class="bvMsg">
<div>
这段时间在写一个WEB的测试程序,根据ZV的推荐,采用了Python实现,因为有个PAMIE的开源包在测试WEB页面时非常好用。但是在使用
PAMIE时发现它的findWindow函数非常难用,导致测试程序很难控制新开的IE窗口,例如HTML:<a href="b.html"
target="_blank">link_content</a>,这种链接打开的新IE窗口。</div>
<div>
通过阅读PAMIE的源码也找不到合适的解决办法,只有自己动手啦。我参考了IEC的开源包的方法,自己修改了PAMIE的cPAMIE.py的
PAMIE类的构造函数,修改后的构造函数根据输入的URL地址可以找到当前已经找到的IE窗口,如果没有发现匹配的窗口,那么PAMIE会新建一个窗口
打开该URL。</div>
<div> 下面是修改后的代码:</div>
<div>
<span style="background-color: #ffffff; color: #0000ff;"> from win32com.client import Dispatch #需求增加的import语句</span>
</div>
<div> </div>
<div>
<span style="background-color: #ffffff; color: #0000ff;"> # 2006-5-10 Modified by YinXianglong to find a opened IE Window. BEGIN<br>
def __init__(self, url=None, isFind=False, timeOut=300):<br>
""" The class instantiation code. When the object is instantiated you can<br>
pass a starting URL. If no URL is passed then about:blank, a blank<br>
page, is brought up.<br>
parameters:<br>
[url] - url to navigate to initially<br>
[isFind] - if isFind = True, find a opened IE Window whose LocationURL is equal to url<br>
[timeOut] - how many 100mS increments to wait, 10 = 1sec, 100=10sec<br>
returns:<br>
Nothing<br>
""" <br><br>
self.showDebugging = True # Show debug print lines?<br>
self.colorHighlight = "#F6F7AD" # Set to None to turn off highlighting<br>
self.frameName = None # The current frame name or index. Nested frames are<br>
# supported in the format frame1.frame2.frame3<br>
self.formName = None # The current form name or index<br>
self.busyTuner = 1 # Number of consecutive checks to verify document is no longer busy.</span>
</div>
<div>
<span style="color: #0000ff;"><span style="background-color: #ffffff;"> find_ok_flag = False<br>
if isFind and (url != ''):<br>
clsid='{9BA05972-F6A8-11CF-A442-00A0C90A8F39}'# CLSID for ShellWindows<br>
ShellWindows = Dispatch(clsid)<br>
url = url.lower()<br>
for i in range(ShellWindows.Count):<br>
if ShellWindows[i].LocationURL.lower().find(url) > -1:<br>
self._ie = ShellWindows[i]<br>
find_ok_flag = True<br>
if not find_ok_flag: <br>
print "Can't Find the opened IE Window whose LocationURL is equal to url." <br>
self._ie = DispatchEx('InternetExplorer.Application')<br>
if url:<br>
self._ie.Navigate(url)<br>
else:<br>
self._ie.Navigate('about:blank')<br><br>
self._timeOut = timeOut<br>
self._ie.Visible = 1<br>
self.timer = datetime.datetime.now() <br>
# 2006-5-10 Modified by YinXianglong to find a opened IE Window. </span>
END</span>
</div>
<div> </div>
<div>
<em><span style="color: #ff0000;"> 其他代码同PAMIE2.0的代码相同。 </span>
</em>
</div>
<div> </div>
<div> 下面是测试代码:</div>
<div>
<span style="background-color: #ffffff; color: #0000ff;"> import yxlPAMIE</span>
</div>
<div>
<span style="background-color: #ffffff; color: #0000ff;"> ie = yxlPAMIE.PAMIE("</span>
<a href="http://172.17.153.171/NewSys/default.aspx"><span style="background-color: #ffffff; color: #0000ff;">http://172.17.153.171/NewSys/default.aspx</span>
</a>
<span style="background-color: #ffffff; color: #0000ff;">")</span>
</div>
<div>
<span style="background-color: #ffffff; color: #0000ff;"> print ie.pageGetText()</span>
<br>
</div>
<div> 测试结果是显示了已经打开的<a href="http://172.17.153.171/NewSys/default.aspx"><span style="color: #0000ff;">http://172.17.153.171/NewSys/default.aspx</span>
</a>
窗口的HTML代码。</div>
</div>
<p></p>
<p>附录:网易注册程序代码</p>
<p>#coding:gbk<br>
import cPAMIE<br>
import time<br>
import random<br>
username = ''.join(random.sample('abcdefghijklmnopqrstuvwxyz0123456789',8))<br>
password = '******'<br>
zhanghao = '|'.join([username,password])<br>
ie= cPAMIE.PAMIE()<br><br>
#打开目标网页<br><br>
ie.navigate ('http://reg.163.com/reg0.shtml')<br><br>
#注意下面所列的 第一个参数如 fistname 等 都是 网页源代码里的 input name="firstname"<br>
#里找出来的,不能用 网页上看见的黑体字: "First Name:"<br>
#填文本框<br>
ie.textBoxSet('username',username)<br><br>
ie.textBoxSet('password','*****')<br>
ie.textBoxSet('cpassword','*****')<br><br>
#先择下拉菜单:<br><br>
ie.listBoxSelect('question',unicode('我的自定义问题', 'cp936'))#注意此处编码转换 cp936 可以换成GBK<br>
ie.textBoxSet('myQuestion','wodewentishishenme')<br>
ie.textBoxSet('answer','wodoubuxihuan')<br>
ie.textBoxSet('year','1986')<br>
ie.listBoxSelect('month','6')<br>
ie.listBoxSelect('day','22')<br>
#方形选择框:<br><br>
#ie.checkBoxSet('cxbx',1) #1 2 3 或 * 号等都是 "勾选"的意思 '' 空字符串代表取消选择<br><br>
#圆形选择框: 英语是 radio 做过网页设计就容易知道这些元素的命名了<br>
#这里选择 Jazz<br>
ie.radioButtonSet("gender","1") # music是这个 选择列表的名字,从网页源代码里找出<br><br><br>
#最后提交按钮<br><br>
print "请输入验证码 然后提交"<br>
#ie.buttonClick("Submit") #用来取代鼠标点击 方便多了<br><br>
i = 0<br>
while i<100:<br>
pass<br>
i = i+1<br>
if True == ie.findText(unicode('恭喜', 'gbk')):<br>
break</p>
<p>fp = open('163zhanghao.txt','a')<br>
fp.write(zhanghao+'/n')<br>
fp.close()<br>
ie.quit()</p>
<p></p>
<p></p>
<p>循环注册</p>
<p>#coding:gbk<br>
import cPAMIE<br>
import time<br>
import random<br>
username = ''.join(random.sample('abcdefghijklmnopqrstuvwxyz0123456789',8))<br>
password = 'wokao1'<br>
zhanghao = '|'.join([username,password])<br>
i = 0<br>
while i<1000:<br>
ie= cPAMIE.PAMIE()<br>
ie.navigate ('https://passport.baidu.com/?reg')<br>
ie.textBoxSet('username',username)<br>
ie.textBoxSet('loginpass','*****')<br>
ie.textBoxSet('verifypass','*****')<br>
ie.radioButtonSet("sex","1") <br>
ie.textBoxSet("email",username+'@msn.cn')<br>
i = 0<br>
while i<1000:<br>
pass<br>
i = i+1<br>
if True == ie.findText(unicode('恭喜', 'gbk')):<br>
break<br>
fp = open('163zhanghao.txt','a')<br>
fp.write(zhanghao+'/n')<br>
fp.close()<br>
ie.quit()<br>
i = i+1</p>
<p></p>
<p>==============================================</p>
<table class="modth" style="width: 100%;" border="0" cellspacing="0" cellpadding="0"><tbody><tr>
<td class="modtc">
<div class="modttitle">
<a href="http://www.turbozv.com/read.php?20">Python PAMIE 是个不错的测试工具</a>
</div>
</td>
<td class="modtr-p" align="right"></td>
<td class="modtr"></td>
</tr></tbody></table>
<table style="width: 100%;" border="0" cellspacing="0" cellpadding="0"><tbody><tr>
<td width="70%">
<div class="textbox-label">[<img title="不指定" src="http://www.turbozv.com/images/weather/blank.gif" alt="不指定">
2006/03/21 15:06 | by <a href="http://www.turbozv.com/view.php?go=user_1" target="_blank">turbozv</a>
]
</div>
</td>
<td width="30%">

</td>
</tr></tbody></table>
P.A.M.I.E. - stands for Python Automated Module For I.E.<br><br>
官方主页: <a href="http://pamie.sourceforge.net/" target="_blank">http://pamie.sourceforge.net/</a>
<br><br><br><br>
PAMIE是一套为Python写的用于Web自动化测试的工具,采用Win32COM的方式操作IE来实现。原理比较简单,但是可以真实再现用户的使用,QA用非常合适:)<br><br><br><strong>安装:</strong>
<br><a href="http://down.turbozv.com/develop/python/webtest/ctypes-0.9.9.3.win32-py2.4.exe" target="_blank">http://down.turbozv.com/develop/python/webtest/ctypes-0.9.9.3.win32-py2.4.exe</a>
<br><a href="http://down.turbozv.com/develop/python/webtest/pamie20.zip" target="_blank">http://down.turbozv.com/develop/python/webtest/pamie20.zip</a>
<br><br><br><strong>使用:</strong>
<br>
来测试一个最简单的例子:<br><div class="code">
<br>
import cPAMIE<br><br>
ie = cPAMIE.PAMIE() <br>
ie.navigate(/"http://www.dormforce.net/Blog/parvel/login.aspx/") <br>
ie.textBoxSet(/"tbUserName/", /"parval/")<br>
ie.textBoxSet(/"tbPassword/", /"hehe/")<br>
ie.buttonClick(/"btnLogin/")<br><br>
if (True == ie.findText(u/"非法登录/")):<br>
print /"login failed!/"<br>
else:<br>
print /"login ok!/"<br><br>
ie.quit()<br>
</div>
<br>
直接操作页面上的form元素,访问页面的文本信息,来判断用户登陆是否成功。<br><br><br>
有点可惜的是官方文档非常少,很多都是Under construction…… 呵呵,不过本来就是很简单的东西,看看实现就知道了:)
</div>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值