id: "can",direct:
"true"])
TextBox(uid: "searchLabel",clocator: [tag: "span",text: "for"])
InputBox(uid: "searchBox",clocator: [type: "text",name: "q",id: "q"])
SubmitButton(uid: "searchButton",clocator: [value: "Search",direct:
"true"])
}
然后使用下面这个测试方法:
public void searchIssue(String type,String issue){
select "issueSearch.issueType",type
keyType "issueSearch.searchBox",issue
click "issueSearch.searchButton"
waitForPageToLoad 30000
}
如果有一天,你需要把Selector修改成输入框,那我们只需要更新对应的UI module:
ui.Form(uid: "issueSearch",clocator: [action: "list",method: "GET"]) {
InputBox(uid: "issueType",clocator: [name: "can",direct: "true"])
TextBox(uid: "searchLabel",clocator: [tag: "span",text: "for"])
InputBox(uid: "searchBox",clocator: [type: "text",name: "q",id: "q"])
SubmitButton(uid: "searchButton",clocator: [value: "Search",direct: "true"])
}
然后修改命令:
select "issueSearch.issueType",type
为:
type "issueSearch.issueType",type
其余则保持不变。
如果有动态的Web内容,比如Google Books的网站,它包含了一个图书分类的列表,每个分类中包含一个图书列表。针对这样UI的UI module会出奇的简单:
ui.Container(uid: "GoogleBooksList",clocator: [tag: "table",id: "hp_table"]) {
List(uid: "subcategory",clocator: [tag: "td",class: "sidebar"],separator:
"div") {
Container(uid: "{all}") {
TextBox(uid: "title",clocator: [tag: "div",class: "sub_cat_title"])
List(uid: "links",separator: "p") {
UrlLink(uid: "{all}",clocator: [:])
}
}
}}
Tellurium UID描述语言为定义动态Web内容提供了更多的灵活性。我们来看个复杂点的例子。
ui.StandardTable(uid: "GT",clocator: [id: "xyz"],ht: "tbody"){
TextBox(uid: "{header: first} as One",clocator: [tag: "th",text: "one"],self:
true)
TextBox(uid: "{header: 2} as Two",clocator: [tag: "th",text: "two"],self: true)
TextBox(uid: "{header: last} as Three",clocator: [tag: "th",text: "three"],
self: true)
TextBox(uid: "{row: 1,column -> One} as A",clocator: [tag: "div",class: "abc"])
Container(uid: "{row: 1,column -> Two} as B"){
InputBox(uid: "Input",clocator: [tag: "input",class: "123"])
Container(uid: "Some",clocator: [tag: "div",clas
|