用于web应用程序功能黑盒测试的可编程web浏览器

zc.testbrowser的Python项目详细描述


概述:zc.testbrowser包为web用户代理(浏览器)提供了用于测试web应用程序的编程接口,尤其是与doctest结合使用的接口。一个用于通过http(zc.testbrowser.browser)访问web
站点,另一个用于控制firefox web
浏览器(zc.testbrowser.real)。所有类型的TestBrowser都有相同的API。

此项目源于Zope 3社区,但不是特定于Zope的(ZC命名空间包代表"Zope Corporation")。
更改
===


>1.0a5(2008-05-??)
----

-错误修复:修复了为真正的测试浏览器在文本区域设置值的问题。感谢Taylor Sittler提供的错误报告和修复。

-错误修复:在机械化实现中修复了命名锚链接的处理。

-错误修复:添加了命名锚链接的测试。

-错误修复:添加了项控件的"click()"方法的测试。

-错误修复:实现了真正浏览器实现的item控件的"click()"方法。现在还可以正确地处理禁用的控件。

-错误修复:正确地为所有项目控件的情况实现"tb_set_checked()"javascript函数。

-错误修复:向browser.contents of real.browser添加了<;doctype和<;html>;节点。

-功能:改进的测试句柄er用于http处理简单表单和多部分表单。

-特性:改进了文件上传元素的测试;现在将提交传入的文件内容
,并对提交进行测试。

-特性:正确实现了控件的"add_file()"方法ct用于真正的testbrowser实现。

-功能:支持firefox 3和mozlab 0.1.9。由于API更改,TestBrowser不再与MozLab 0.1.8一起工作。




<1.0A4(2008-03-06)
----


-错误修复:修复一些打包错误。




1.0A3(2008-03-06)
----

-重组:中断一些接口,使各种接口浏览器
实现可以说出更少的谎言。

-重构:显式地等待异步事件(如页面加载)。



1.0a2(2008-02-15)
----


-错误修复:删除了对javascript错误的pdb调用在"testbrowser.real`

-bugfix:``getlink()``中重新包装HTML标记,直到页面加载到
``testbrowser.real`



<1.0a1(2007-09-28)
----

-first release under new name(从
zope.testbrow中提取的非zope特定代码SER)内容:



``浏览器`
实例有一个``base``属性,用于设置与``open`-ed
url相对应的url。这允许您在运行在不同位置、甚至可变位置(如使用随机选择的端口)的服务器上进行目标测试。

>;>;>browser.base='http://localhost:%s/'%test_port

>;>browser.open('index.html')
>;>>browser.url
'http://localhost:…/index.html'


在最初打开网页后,编写
testbrowser文档的最佳实践建议使用"click"进一步导航(如下面讨论的
),除非在特殊情况下。

er符合ibrowser接口;请参见
``zc.testbrowser.interfaces``了解有关该接口的详细信息。

>;>;从zope.interface导入zc.testbrowser.interfaces
>;>;验证导入verifyobject
>;>;zc.testbrowser.interfaces.ibrowser.providedby(浏览器)
true
>;>verifyobject(zc.testbrowser.interfaces.ibrowser,browser)
true



page contents
----


>当前页面的内容可用:

>;browser.contents
'…<;h1>;simple page<://h1>;…'

注意:很遗憾,
输出开头不能使用省略号(…)(这是doctest的一个限制)。

owser.目录
<;!doctype html public"-//w3c//dtd xhtml 1.0 transitional//en""http://www.w3.org/tr/xhtml1/dtd/xhtml1 transitional.dtd">;
<;html>;
<;head>;…


当然,我们的简单页面会:

>;>browser.ishtml
true


,但是如果我们加载图像(或其他二进制文件),就不会得到html:

>;>browser.open('zope3logo.gif')
>;>browser.ishtml

文本类型也会被处理。

>;>browser.open('test.txt')
>;>browser.ishtml
false
>;>print browser.contents
some text
>;>browser.open('test.css')
>;>browser.ishtml
false
>;>print browser.contents
*{
margin:0;
padding:0;
}






HTML页标题
----


另一个有用的助手属性是标题:

>;>;browser.open('index.html')
>;>;browser.title
"简单页"

ser.title

但是,如果输出不是html,则在尝试访问标题:


>;>;browser.open('zope3logo.gif')
>;>;browser.title
回溯(最近一次调用):

browserstateerror:不查看html


导航和链接对象
-如果要模拟单击链接,请获取链接并调用其"click"方法。在"navigate.html"文件中,有几个链接设置为
演示链接对象及其"click"方法的功能。

获取链接的最简单方法是通过锚文本。换句话说,您在浏览器中看到的文本:

>;>;browser.open('navigate.html')
>;>;browser.contents
'…<;a href="target.html">;link text<;a>;…'
>;>;link=browser.getlink('link text')
>;link
<;link text='link text'url='http://localhost:…/target.html'>;

指向引用的URL。

>;>;link.click()
>;>;browser.wait()
>;>;browser.url
'http://localhost:…/target.html'
>;>;browser.contents
'…此页是链接的目标…'


需要等待浏览器完成页面加载。您可以通过调用浏览器的"wait()"方法来实现这一点。当您单击一个链接,该链接只会将您带到一个命名锚时,不应调用"wait()",因为页面未重新加载,结果是立即的:

>;>;browser.open('navigate.html')
>;>;link=browser.getlink('link to named target')
>;>;link
<;link text='link to named target'
url='http://localhost:…/navigate.html\target'>;
>;link.click()
>;>>链接。url
'http://localhost:…/navigate.html target'


按文本查找链接时,将规范化空白。

>;>browser.open('navigate.html')
>;>browser.contents
…>;将文本链接为空白\n规范化(和括号)<;/…'
>;>;link=browser.getlink('link text with whitespace normalization'
…'(和parens)
>;>link
<;link text="link text with whitespace normalization(和parens)"…>;
>;>link.text
"link text with whitespace normalization(和parens)"
>;>link.click()
>;>browser.wait()
>;>browser.url
'http://localhost:。../target.html'

当一个链接文本与多个链接匹配时,默认情况下第一个链接被选中。但是,您可以指定链接的索引,从而检索随后匹配的链接:

>;>;browser.open('navigate.html')
>;>;browser.getlink('link text')
<;link text='link text'…>;

>;>;browser.getlink('link text',index=1)
<;link text='link text with whites空间规范化(和parens)…>;

请注意,在链接对象的浏览器页面过期后单击该对象将
生成错误。

>;>;链接。单击()
回溯(最近的调用最后一次):

过期错误

您还可以按url查找链接,

>;浏览器。打开('navigatee.html')
>;>;browser.getlink(url='target.html').click()
>;>;browser.wait()
>;>;browser.url
'http://localhost:…/target.html'

或其ID:

>;>;browser.open('navigate.html')
>;>;browser.contents
'…<;a href="target.html"id="anchorid">;通过锚id<;/a>;…'

>;>browser.getlink(id='anchorid').click()
>;>browser.wait()
>;>browser.url
'http://localhost:…/target.html'

不是那么快。"getlink"方法也支持图像映射,但不是通过指定坐标,而是使用
区域的id:

>;>;浏览器。打开('navigate.html')
>;>;链接=浏览器。getlink(id='zope3')
>;>;链接。单击(
>;>;浏览器。等待()
>;>;浏览器。url
p://localhost:…/target.html'


获取不存在的链接会引发异常。

>;>;browser.open('navigate.html')
>;>;browser.getlink('this not existent')
回溯(最近一次调用):

linknotfounderror


e在任何普通浏览器中,您都可以重新加载页面:

>;>browser.open('index.html')
>;>browser.url
'http://localhost:…/index.html'
>;>browser.reload()
>;>browser.url
'http://localhost:…/index.html'

wser.open('notitle.html')
>;>browser.url
'http://localhost:…/notitle.html'
>;>browser.goback()
>;>browser.url
'http://localhost:…/index.html'


在控件的值中输入表单。为此,我们首先打开一个包含一组控件的页面:

>;>;browser.open('control s.html')

默认的第一个
参数是"label",并根据任何关联的
标签查找表单。


>;control=browser.getcontrol('text control')
>;>;control
<;control name='text-value'type='text'>;
>;>;browser.getcontrol(label='text control')等效的
<;c如果请求不存在的控件,则代码将引发一个"lookuperror":

如果控件中的某个选项与控件本身有关而不明确,则代码会引发一个
`Ambiguityerror`.


>;>;browser.getControl('Ambiguity Control')
traceback(最近的最后一次调用):

Ambiguityerror:label'Ambiguity Control'

er.getcontrol('sub-control difficity')
回溯(最后一次调用):

歧义错误:标签"sub-control difficity"

可以使用索引值指定歧义控件。我们使用控件的
值属性来显示这两个控件;此属性已在下面正确引入


>;browser.getcontrol('digulary control',index=0)
<;control name='digulary-control-name'type='text'>;
>;>;browser.getcontrol('digulary control',index=0)。value
'first'
>;>;browser.getcontrol('digulary control',index=1)。value
'second'
>;>;browser.getcontrol('sub-control digulary',index=0)
<;listcontrol name='digulary-subrol'type='select'>;
>;>;browser.getcontrol('sub-control digulary',index=1)。optionvalue
'digulary'

标签搜索是针对
文本的剥离、规范化的空白、无标记版本的。应用于搜索的文本也将被剥离,并规范化空白。
如果文本搜索在标签中找到
文本的整个单词,则搜索将查找结果。因此,例如,搜索"add"将匹配标签
"add a client",而不是"address"。以大小写为准。

>;>browser.getcontrol('label需要空白规范化')
<;control name='label-needs-normalization'type='text'>;
>;>browser.getcontrol('label需要空白规范化')
回溯(最近一次调用最后一次):

lookuperror:label需要whitespace normalization'
>;>browser.getcontrol('label needs whitespace')
<;control name='label-needs-normalization'type='text'>;
>;>browser.getcontrol('whitespace')
<;control name='label-needs-normalization'type='text'>;
>;>browser.getcontrol('hitespace')
traceback(最后一次调用):

lookuperror:label'hitespace'
>;>browser.getcontrol('[非单词字符不应混淆])
<;control name='non-word-characters'type='text'>;

/>
>;>;browser.getcontrol('multiple labels really')
<;control name='two-labels'type='text'>;

>;>;browser.getcontrol('really are possible')
<;control name='two-labels'type='text'>;

>;>;确定:标签不明确,但控件不模糊
>;>;browser.getcontrol('really')
<;控件名称='two-labels'type='text'>;

标签可以通过包含其各自的字段来连接')
<;control name=-contained-in-label'type=-text'>;

"name"中的一个。"name"关键字搜索表单字段名。

>;>;browser.getcontrol(name="text-value")
<;control name="text-value"type="text">;
>;>;browser.getcontrol(name="digulary-control-name")
回溯(最近一次调用):

ambiguityerror:name"不明确的控件名"
>;>browser.getcontrol(name='does-not-exist')
traceback(最近一次调用的最后一次):

lookuperror:name"不存在"
>;>browser.getcontrol(name='digulary-control-name',index=1)。value
"second"

组合"label"和"name"会产生一个值错误,同时提供这两个值都不会。

>;>;browser.getcontrol(
…label='digulary control',name='digulary-control-name')
回溯(最近的最后一次调用):

valueerror:仅提供一个"label"和"name"作为参数
>;>browser.getcontrol()
回溯(最近的最后一次调用):

valueerror:只提供一个"label"和"name"作为参数



逻辑集合中的oices。这意味着按标签获取单选按钮得到的对象与按名称获取单选集合得到的对象不同。选择选项
也可以按标签搜索。

>;>;browser.getcontrol(name='radio-value')
<;listcontrol name='radio-value'type='radio'>;
>;>;browser.getcontrol('zwei')
<;itemcontrol name='radio-value'type='radio'optionvalue='2'选择cta=true>;
>;>browser.getcontrol('one')
<;itemcontrol name='multi-checkbox-value'type='checkbox'
optionvalue='1'selected=true>;
>;>browser.getcontrol('tres')
<;itemcontrol name='single-select-value'type='select'
optionvalue="3"selected=false>;

下面讨论控件和子控件的特性。


控件对象提供icontrol。

~trl
<;control name="text-value"type="text">;
>;>verifyobject(zc.testbrowser.interfaces.icontrol,ctrl)
true

"文本值"

-也可以设置的控件值:

>;>;ctrl.value
"某些文本"
>;>;ctrl.value="更多文本"
>;>;ctrl.value
"更多文本"

-控件类型:

>;ctrl.键入
"text"

-一个描述控件是否被禁用的标志:

>;>;ctrl.disabled
false

>-一个指示控件是否可以有多个值的标志:

>;ctrl.multiple
false

select、radio和checkbox的控制器提供
`ilistcontrol`。这些字段还有四个其他属性和一个附加的
方法:

>;>ctrl=browser.getcontrol('多选控件')

>;>;ctrl
<;listcontrol name='多选值'type='选择'>;
>;>;ctrl.禁用
false

>;>;ctrl.多选
true
>;>;验证对象(zc.testbrowser.interfaces.ilistcontrol,ctrl)
true

'列出所有可用的值选项。

>;[o在ctrl.options中为o使用unicode(o)]
[u'1',u'2',u'3']

-'displayoptions'按标签列出所有可用的选项。选项的"label"
属性优先于其内容,这就是为什么我们的最后一个选项在显示中是"third"。

>;>;ctrl.displayoptions
['un'、'deux'、'third']

-'displayvalue'允许您获取和设置选择框控件的显示值,而不是ac实际值。


>>;gt>gt;ctrl.displayvalue
>
[>>>>>>>>>>>>>>>>>
>>>>;ctrl.displayvalue=['un','deux']
>>gt;ctrl.displayvalue
>['un','deux']
>;[unicode(v)代表v代表v代表v代表v代表v代表v代表v,v代表v代表v代表v代表v代表v代表v,v代表v代表v代表v代表v代表v,v代表v代表v代表v代表v代表v代表v,v代表v代表v代表v,v代表v代表v代表v代表v代表v代表v的v代表v,T列表控件中的子控件对象
(下面讨论子控件)。

>;>;ctrl.controls
[<;itemcontrol name="multi-select-value"type="select"
optionvalue="1"selected=true">;,
<;itemcontrol name="multi-select-value"type="select"
optionvalue="2"selee"cta=true>;,
<;itemcontrol name='multi-select-value'type='select'
optionvalue='3'sele cted=false>;]

-'getcontrol()'方法允许您通过子角色的标签或其
值获取子角色。

>;ctrl.getcontrol('un')
<;itemcontrol name='multi-select-value'type='select'
optionvalue='1'selected=true>;
>;>ctrl.getcontrol('deux')
<;itemcontrol name='multi-select-value'type='select'
optionvalue='2'selected=true>;
>;>ctrl.getcontrol('trois')标签属性
<;itemcontrol name='multi-select-value'type='select'
optionvalue='3'selected=false>;
>;>ctrl.getcontrol('third')\contents
<;itemcontrol name='multi-select-value'type='select'
optionvalue='3'selected=false>;
>;>browser.getcontrol('third')\b在浏览器中不明确,因此很有用
回溯(大多数recent call last):

含糊不清错误:label'third'


最后,提交控件提供'isubmitcontrol',图像控件提供
'iimagesubmitcontrol',其范围为'isubmitcontrol'。这两种方法都只是添加一个
`click()`方法。对于图像提交控件,您还可以提供一个coordinates
参数,它是(x,y)的元组。这些控件提交表单,并在下面分别检查每个控件时演示。


item control objects
~~~~~~~~~~~~~~~~~~~~~~~~~~


如上所述,使用标签获取逻辑
单选按钮或复选框集合的元素将返回项控件,这些控件是父控件。
操作这些控件的值控件影响父控件。

>;[unicode(v)for v in browser.getcontrol(name='radio-value').value]
[u'2']
>;>browser.getcontrol('zwei').optionvalue只读。
'2'
>;>browser.getcontrol('zwei')。选择了
true

>;>verifyobject(zc.testbrowser.interfaces.iitemcontrol,
…browser.getcontrol('zwei')
true
>;>browser.getcontrol('ein')。选择
false
>;>browser.getcontrol('ein')。选择=true
>;>browser.getcontrol('ein')。选择
true

o当然,在这一点上,之前选择的"zwei"将被取消选择,因为只能选择一个单选按钮。

>;>;browser.getcontrol('zwei')。选择了
false

>;>;browser.getcontrol('zwei')。选择了
false
>;[uni在browser.getcontrol(name='radio-value').value]
[u'1']



此测试无效,因为(使用浏览器)无法取消选择单选框…一个单选框(必须始终保持选中状态)。这曾经是机械化的测试,因为机械化并没有实现,所以过去是通过的。通过运行3级测试,我们将在Mechanize和"Real"浏览器测试下运行这些测试。



browser.getcontrol('ein')。selected=false
browser.getcontrol('ein')。selected
false

browser.getcontrol(name='radio-value')。value
[]

>;>browser.getcontrol('zwei')。selected=true


复选框集合的行为类似,如下所示。


具有子角色的控件--

-文本控件

上面介绍的文本控件。

-密码控件

>;ctrl=browser.getcontrol('password control')
>;>;ctrl
<;control name='password-value'type='password'>;
>;>;verifyobject(zc)。testbrowser.interfaces.icontrol,ctrl)
true
>;>;ctrl.value
"password"
>;>;ctrl.value="pass now"
>;>;ctrl.value
"pass now"
>;>;ctrl.disabled
false
>;>;ctrl.multiple
false

-隐藏控件

>;>;ctrl=browser.getcontrol(name='hidden-value')
>;>;ctrl
<;control name='hidden-value'type='hidden'>;
>;>;verifyobject(zc.testbrowser.interfaces.icontrol,ctrl)
true
>;>;ctrl.value
"隐藏"
>;>;ctrl.value="更隐藏"
>;>;ctrl.disabled
false
>;>;ctrl.multiple
false

-文本区域控制

>;>;ctrl=browser.getcontrol("文本区域控制")
>;>;ctrl
<;控件名称='text area-value'类型='textarea'>;
>;>;验证对象(zc.testbrowser.interfaces.icontrol,ctrl)
真值
>;>;ctrl.value
'区域内的文本!\ n'
>;>;ctrl.value='大量文本。'
>;>;ctrl.value
'大量文本。'
>;>;ctrl.disabled
false
>;>;ctrl.multiple
false

-文件控制

文件上载字段。
若要指定数据,请调用add_file方法,传递:

-类似文件的对象

-内容类型,以及

-文件名

>;ctrl=browser.getcontrol('file control')
>;ctrl
<;control name='file-value"type="file">;
>;>;verifyobject(zc.testbrowser.interfaces.icontrol,ctrl)
true
>;>;ctrl.value为none
true
>;>;import cstringio

>;>;ctrl.add_file(cstringio.stringio("文件内容"),
…"text/plain"、"test.txt")

单值)

>;>;ctrl=browser.getcontrol('single select control')
>;>;ctrl
<;listcontrol name='single-select值"type="select">;
>;>;verifyobject(zc.testbrowser.interfaces.ilistcontrol,ctrl)
true
>;[unicode(v)表示v在ctrl.value中]
[u'1']
>;>;ctrl.value=['2']
>;>;ctrl.disabled
false
>;>;ctrl.multiple
false
>;>;[Unicode(O)O在O中的O在CTRL中的选择权]
[U'1',U'2',U'2',U'3']
>>gt;CTRL.displayoptions
['UNO','DOS','DOS','Third']
>>>>gt;CTRL.displayvalue
['DOS']
>>;CTRL.displayvalue=['Trees']
>>>;CTRL.displayvalue=['DOS']]>
>['Third']>
>>>>;CTRL.displayvalue==['DOS']]]>>>>>>>>>>>>>>>
>;>>ctrl.displayvalue
['dos']
>;>>ctrl.displayvalue=['third']
>;>>ctrl.displayvalue
['third']
>;[ctrl.value中v的unicode(v)]
[u'3']

>;<;itemcontrol name='单选值'type='select'
optionvalue='2'selected=false>;

>;>ctrl.getcontrol('dos')。click()
>;>ctrl.getcontrol('dos')
<;itemcontrol name='single-select-value'type='select'
optionvalue='2'selected=true>;

>;>;>;ctrl.getcontrol('dos')
<;itemcontrol name='single-select-value'type='select'
optionvalue='2'selected=false>;
>;>;ctrl.getcontrol('tres')
<;itemcontrol name='single-select-value'type='select'
optionvalue='3'selected=true>;

>;>;ctrl.getcontrol('tres')。click()
>;>ctrl.getcontrol('tres')
<;itemcontrol name='single-select-value'type='select'
optionvalue='3'selected=false>;

-选择控件(多值)

>;ctrl=browser.getcontrol('multiple select control')
>;ctrl
<;listcontrol name="multi-select-value"type="select">[u'un,u'third']

>;>;ctrl.value=[]

>;>;ctrl.getcontrol('deux')。click()
>;>;ctrl.getcontrol('deux')
<;itemcontrol name='multi-select-value'type='select'
optionvalue='2'selected=true>;

>;>;ctrl.getcontrol('trois')。click()
>;>>ctrl.getcontrol('deux')
<;itemcontrol name='multi-select-value'type='select'
optionvalue='2'selected=true>;
>;>;ctrl.getcontrol('trois')
<;itemcontrol name='multi-select-value'type='select'
optionvalue='3'selected=true>;

>;>;ctrl.getcontrol('trois')。click()
>;>ctrl.getcontrol('trois')
<;itemcontrol name='multi-select-value'type='select'
optionvalue='3'selected=false>;

-复选框控件(单值;未值)

>;ctrl=browser.getcontrol(name='single-unvalue-checkbox-value')
>;>gt;ctrl
<;listcontrol name='single-unvalued-checkbox-value'type='checkbox'>;
>;>verifyobject(zc.testbrowser.interfaces.ilistcontrol,ctrl)
true
>;ctrl.value
>;true
>;ctrl.value=false
>;ctrl.disabled
false
>;ctrl.multiple
true
>;>;ctrl.options
[true]
>;>;ctrl.displayoptions
['single unvalue checkbox']
>>>gt;ctrl.displayValue
[]
>>>验证对象(
…zc.testbrowser.interfaces.iitemcontrol,
…browser.getcontrol('single unvalued checkbox'))
true
>;>;browser.getcontrol('single unvalued checkbox').optionvalue
'on'
>;>;browser.getcontrol('single unvalued checkbox').selected
false
>;>;ctrl.displayvalue=['single unvalued checkbox']
>;>;ctrl.displayv值
['单值复选框']

>;>subctrl=ctrl.getcontrol('single unvalued checkbox')
>;>subctrl.selected
>;>true
>;>subctrl.selected=false
>;>subctrl.selected
>;
>;subctrl.click()
>;>subtrl.selected
true
>;>subtrl.click()
>;>subtrl.selected
false

>;>disabledctrl=browser.getcontrol(
…name='single-disabled-unvalued-checkbox-value')
>;'disabledctrl
<;listcontrol name='single-disabled-unvalued-checkbox-value'type='checkbox'>;
>;'disabledctrl.disabledctrl.disabled
true
>;'disabledctrl.getcontrol('single disabled unvalued checkbox')。click()
traceback(最新的最后调用):

属性错误:项目已禁用

-复选框控件(单值,值)

>;>;ctrl=browser.getcontrol(name="单值-checkbox-value')
>;>;ctrl
<;listcontrol name="单值-checkbox-value"type="checkbox">;
>;>;验证对象(zc.testbrowser.interfaces.ilistcontrol,ctrl)
true
>;[unicode(v)表示v在ctrl.value中]
[u'1']
>;>;ctrl.value=[]
>;>;ctrl.disabled
false
>;>;ctrl.multiple
true
>;[unicode(o)表示o在ctrl.options中]
[u'1']
>;>;ctrl.displayOptions
["单值复选框"]
>;>>ctrl.displayValue
[]
>;>>验证对象(
…zc.testbrowser.interfaces.iitemcontrol,
…browser.getcontrol("单值复选框")
true
>;>;browser.getcontrol("单值复选框")。已选择
false
>;>;browser.getcontrol("单值复选框")。optionvalue
'1'
>;>;ctrl.displayvalue=["单值复选框"]
>;>;ctrl.displayvalue
["单值复选框"]
>;>browser.getcontrol("单值复选框")。选择
true
>;>browser.getcontrol("单值复选框")。选择=false
>;>browser.getcontrol("单值复选框")。选择
false
>;[]

>;>>subctrl=ctrl.getcontrol("单值复选框")
>;>>subctrl.selected
false

>;>>subctrl.click()
>;>>subctrl.selected
true
>;>>subctrl.click()
>;>subctrl.selected
false

-复选框控件(多值)

>;>;ctrl=browser.getcontrol(name='multi-checkbox-value')
>;ctrl
<;listcontrol name='multi-checkbox-value'type='checkbox'>;
>;>;verifyobject(zc.testbrowser.interfaces.ilistcontrol,ctrl)
true
>;[unicode(v)代表v,代表v,在ctrl.value中的v]
[u'1',u'3']
>;gt;>;ctrl.value=['1','2']
>;>;ctrl.disabled
false
>;>;ctrl.multiple
true
>;[unicode(o)表示控制选项中的o]
[u'1',u'2',u'3']
>;ctrl.displayoption
['one','two','three']
>;>ctrl.displayvalue
['one','two']
>;>ctrl.displayvalue=['two']
>;[ctrl.value中v的unicode(v)]
[u'2']
>;>browser.getcontrol('two')。optionvalue
'2'
>;>browser.getcontrol('two')。已选择
true
>;>verifyobject(zc.testbrowser.interfaces.iitemcontrol,
…browser.getcontrol('two')
true
>;>;browser.getcontrol('three')。selected=true
>;>;browser.getcontrol('three')。selected
true
>;>;browser.getcontrol('two')。selected
true
>;[unicode(v)for v in ctrl.value]
[u'2',u'3']
>;>;browser。getcontrol('two')。selected=false
>;[unicode(v)for v in ctrl.value]
[u'3']
>;>browser.getcontrol('three')。selected=false
>;>ctrl.value
[]br/>
>;>subctrl3=browser.getcontrol('three')
>;>subctrl3。selected
false

>;>subctrl3.click()
>;>subctrl3.selected
true
>;>subctrl3.click()
>;>subctrl3.selected
false

>;>browser.getcontrol('two')。click()
>;>browser.getcontrol('three')。click()

>;>browser.getcontrol('two')。selected
true
>;>;browser.get control('three')。selected
true

-radio control

这是获取基于单选按钮的控件的方式:

>;ctrl=browser.getcontrol(name='radio-value')

这显示控件的现有值,与从服务器:

>>gt;[unicode(v)代表v在v在ctrl.value中的值]
[u'2']



我们可以取消选择它:


>>>;ctrl.value=[]
>>;ctrl.value
[>>>



>
>
>;ctrl.value=['2']
>>;[unicode(v)代表v在ctrl.value=['2']>
>>>>;[unicode(v)gt>>>>>>
>>>>>>>>>>>>>>>>>对于控制值中的v]
[U'2']

控件旁边看到的文本:

>;['zwei']


这只是单元测试:

>;<;listcontrol name="radio-value"type="radio">;
>;>true
>> gt;控制。禁用
>false
>;控制。多个
false
>;[unicode(o)o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o o是的>;[unicode(v)表示v在ctrl.value中]
[u'1']
>;>;ctrl.displayvalue
['ein']


zwei')
>;>subtrl2.选定
false

>;>subtrl2.单击()
>;>subtrl2.选定
true
>;>subtrl.选定
false


-图像控制

>;ctrl=browser.getcontrol(name=-image-value')
>;ctrl
<;image control name="image-value"type="image">;
>;>;验证对象(zc.testbrowser.interfaces.iimagesubmitcontrol,ctrl)
true
>;>;ctrl.value
'
>;>;ctrl.disabled
false
>;>;ctrl.multiple
false

-提交控件

>;>;ctrl=browser.getcontrol(name='submit-value')
>>>;ctrl
<;submit control name='submit-value'type='submit'>;

>;>;browser.getcontrol('submit this')submit按钮的值是一个标签
<;submitcontrol name='submit-value'type='submit'>;
>;>;browser.getcontrol('standard submit control')label标记是合法的
<;submit control name="submit-value"type="submit">;

>;>;browser.getcontrol("submit")多个标签,但相同的控件
<;submitcontrol name="submit-value"type="submit">;
>;>;verifyobject(zc.testbrowser.interfaces.isubmitcontrol,ctrl)
true
>;>;ctrl.value
"提交此文件"
>;>;ctrl.disabled
false
>;>;ctrl.multiple
false

可单击并提交表单:

>;>;browser.getcontrol("文本控件").value='其他文本'
>;>;browser.getcontrol("提交").click()
>;>;browser.wait()
>;>;browser.contents
"..'文本值':['其他文本'…"

请注意,如果在关联页过期后单击提交对象,
将出现错误。

>;>;browser.open('controls.html')
>;>;ctrl=browser.getcontrol('submit')
>;>;ctrl.click()
>;>;ctrl.click()
trace后退(最后一次呼叫):

expirederror

ame='图像值').click()
>;>;browser.wait()
>;>;browser.contents
"..'text-value':['other text']…"

>;>;browser.open('controls.html')
>;>;ctrl=browser.getcontrol(name='图像值')
>;>;ctrl.click()
>;>;ctrl.click()
回溯(最近一次调用):

expirederror

但是在发送图像时,也可以指定单击的坐标:

me='image-value')。单击((50,25))
gt;>>浏览器。内容
"…'image-value.x':['50']…'image-value.y':['25']…"


提交表单的另一个有趣方面是正确提交
文件数据。

>;浏览器。打开('controls.html')
>;>;ctrl=browser.getcontrol('file control')
>;>;导入cstringio
>;>;ctrl.add_文件(cstringio.stringio('file contents'),
…'text/plain,'test.txt')
>;>;browser.getcontrol('submit this').click()
>;>;browser.wait()
>;>;browser.contents
"..'file-value':['file contents',…"

forms
----

控件,有时需要按名称或ID访问窗体。可以使用浏览器的"forms"属性来访问窗体。关键值是表单的名称或ID。如果有多个
表单具有相同的名称或ID,则返回第一个。

>;>;browser.open('form s.html')
>;>;form=browser.getform(name='one')

>>>验证对象(zc.testbrowser.interfaces.iform,form)
true


表单公开与表单相关的多个属性:

-表单名称:

>;u'one'

-表单ID:

>>unicode(form.id)
u'1'

-当表单提交:

>;>;Unicode(form.action)
u'http://localhost:…/forms.html'

-用于传输表单数据的方法(http动词):

>;>;Unicode(form.method)
u'post'

-表单数据的编码类型:

>>>>Unicode(form.enctype)
u'application/x-www-form-urlencoded'

除了这些属性之外,您还有两种方法。与
浏览器一样,您可以获取控件对象,但仅限于当前窗体…

>;>;form.get control(name='text-value')
<;control name='text-value'type='text'>;

并提交窗体。

>;>;form.submit('submit')
>;。>;>browser.contents
"…'text-value':['first text']…"


提交也可以在不指定控件的情况下工作,如下所示,这是与上面讨论的控件提交竞争的主要原因。


查找表单有时很重要。在
"forms.html"模板中,有四个表单都有一个名为
"text value"的文本控件。现在,如果我使用浏览器的"get"方法,

>;>browser.open('forms.html')
>;>browser.getcontrol(name='text-value')
回溯(最近一次调用的最后一次):

模糊错误:name'text-value'
>;>browser.getcontrol('text cocontrol')
回溯(最近一次调用的最后一次):

歧义错误:label'text control'

我总是得到一个不明确的表单字段。我可以使用index参数,或者
使用"getform"方法,我可以通过仅在给定的
表单中搜索来消除歧义:

>;>;form=browser.getform('2')
>;>;form.getcontrol(name='text-value')。value
"second text"
>;>;form.submit('submit')
>;>browser.contents
"…"text-value':['second text']…"
>;>browser.open('forms.html')
>;>form=browser.getform('2')
>;>form.getcontrol('submit')。click()
>;>browser.wait()
>;>browser.contents
"…'text-value':['second text']…"
>;>browser.open('forms.html')
>;>browser.getform('3').getcontrol('text-control').value
"third text"

使用king仍然很容易,这要归功于一个保证
顺序的索引属性。(不带提交按钮的表单有时对javascript很有用。)

>;>;form=browser.getform(index=3)
>;>;form.submit()
>;>;browser.contents
"…"文本值":["第四个文本"…"

将引发异常。

>;>;browser.open('forms.html')
>;>;form=browser.getform('does-not-exist')
回溯(最近的最后一次调用):
lookuperror

如果HTML页仅包含一个表单,则不需要"getform"的参数:


>;>;browser.open('one form.html')
>;>;browser.getform()
<;zc.testbrowser…form object at…>;

;browser.open('forms.html')
>;>browser.getform()
回溯(最近一次调用):
valueerror:如果没有给出其他参数,则需要索引。



意外更正
实例属性。

>;>browser.nonexistant=none
回溯(最近的最后一次调用):

attributeerror:"browser"对象没有属性"nonexistant"

>;>form.nonexistant=none
traceback(最近一次调用的最后一次):

attributeerror:"form"对象没有属性"nonexistant"

>;>control.nonexistant=none
traceback(最近的最后一次调用:

attributeerror:"control"对象没有属性"nonexistant"

>;>;link.nonexistant=none
traceback(最近的最后一次调用):

attributeerror:"link"对象没有属性"nonexistant"



fixED Bug
----


本节包括对发现并修复的Bug的测试,这些Bug不适用于以上更以文档为中心的部分。

url中的空格
~~~~~~~~~~~~~~

当url中有空格时,会正确处理它们(在Bug
修复后,您将得到"valueerror:值太多,无法解包"):

>;>;browser.open('navigate.html')
>;>;browser.getlink('spaces in the url')。click()
>;>;browser.wait()

.goback()截断用于截断.contents的方法。

>>gt;browser.open('navigate.html')
>>gt;实际长度=len(browser.contents)

>>browser.open('navigate.html')
>>browser.open('index.html')
>>browser.goback()
>>>>len(browser.contents)==实际长度
true



authors
----


>Benji York在2005年创建了TestBrowser(最初是zope.testBrowser),Gary
Poster和Stephan Richter做出了巨大贡献。

zc.testBrowser.real版本是conc2007年被Benji York接受,2007年9月24日的一周内,Stephan
Richter、Rocky Burt、Justas Sadzevicius和其他人在马萨诸塞州波士顿的Fourige Zope 3
Sprint上完成了最初的实现草图。

非常感谢来自testbrowser用户的离子。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java用变化的替换字符串替换子字符串   从数据库中断中恢复的oracle Java DAL?   Android/Java页边距位于左/右/底部   java如何用相同的源代码构建不同的APK?(我发现了一个错误)   java正则表达式,仅当字符串以一行中的3个数字开头时才匹配第一个数字   使用以xml为输入的给定端点调用java中的rest-ful web服务?   java长字符串转换为UTF8引发异常   java如何使用截取方法获取ArrayList   java将计算列添加到可观察列表中   正则表达式如何在java正则表达式中使用组?   java正则表达式只接受字母表和空格,不允许在字符串的开头和结尾使用空格   java简单onclick按钮在安卓中不起作用   java如何在Spring中只实现Crudepository的特定方法?   java无法使用json对象NPE读取jsonarray   java我可以添加maven依赖项,这些依赖项被打包为除此之外的任何东西。罐子