51Testing软件测试论坛

标题: OpenTest:CodedUI如何支持下拉树形列表选择? [打印本页]

作者: MilgGtery    时间: 2018-3-5 13:58
标题: OpenTest:CodedUI如何支持下拉树形列表选择?
本帖最后由 MilgGtery 于 2018-3-5 17:06 编辑

 在 信息系统开发平台OpenExpressApp:【OpenTest】 之 语法及其使用介绍 中介绍了OpenExpressAp
p中的OpenTest自动化测试的语法,其中对于下拉树形列表在最后语法表格中标记为不支持,现在Open
Test支持下拉树形列表了,本篇介绍一下如何在Win7下支持下拉树形列表。

支持功能
  OEA中自己写了一个ComboGrid,这个Grid是从ComboBox继承下来的,下图中的项目信息和合同科
目是两个下拉控件,项目信息是下拉列表,合同科目是下拉树形列表。自动化测试框架需要支持给下拉
控制赋值。
[attach]111343[/attach]

脚本
  OpenTest自动化测试框架是一个DSL测试框架,在编写框架代码之前就已经确定了脚本语法要
尽量简单易懂,对于下拉列表的支持我把脚本语法示例定义如下:

1
2
属性编辑器("项目信息", :下拉列表).下拉选择("江南四期1、4区项目")
属性编辑器("合同科目", :下拉树形列表).下拉选择("建安工程类合同/建安工程和总包管理配合服务")
开始实现方式:下拉后扩展树形节点进行选择
  给下拉列表赋值,我在Vista下实现时时通过模拟用户操作的步骤来实现的,例如要给合同科目选
择建安工程类合同/建安工程和总包管理配合服务,我是先点击下拉控件,在下拉Popup中扩展第一
级节点建安工程类合同,然后再选择第二级别节点建安工程和总包管理配合服务

对于下拉树形列表大致代码如下:
  1. def 下拉选择(title)
  2.   单击
  3.   tree = 主窗口.树形列表(self.name, "DropDownGrid:")
  4.   tree.选择行(title)
  5. end

  6. class TreeTestObject < GridTestObject
  7.   def 选择行(title)
  8.     path = title.split("/")
  9.     if path.length == 1
  10.       r = 行(title)
  11.       r.Selected = true unless r.Selected == true
  12.     else
  13.       r = 行(path[0])
  14.       r.扩展
  15.       path[1..-2].each{|row_title|
  16.         r = r.行(row_title)
  17.         r.扩展
  18.       }
  19.       r = r.行(path[-1])
  20.       r.Selected = true unless r.Selected == true
  21.     end
  22.     r
  23.   end

  24.   #对象:行
  25.   def 行(title)
  26.     #行号
  27.     puts "行名称:" + title
  28.     tree_item = WpfTreeItem.new(@test_control)
  29.     tree_item.SearchProperties["Name"] = title
  30.     r = TreeItemTestObject.new(tree_item)
  31.     r.name = title
  32.     r
  33.   end
  34. end
复制代码
下拉树形列表其实在XP下已经运行正常,但是由于我前一阵子安装了Vista的机器很慢,终于忍受不住
了装了Win7,而下拉树形列表在Win7下就不怎么听话了。当我执行到扩展时,你会发现树形控件会先
选择当前行并自动扩展一次,后来经过网上资料查找,发现对MenuItem有一个说明. MenuItem Navig
ation is not correct unless the MenuItem has been expanded atleast once.,所以我猜测对于树形控件
,这可能也是CodedUI内部的机制,在正确使用之前,它会先自动选择并扩展一次。但是这个对我来说
是致命性的错误,因为选择后下拉列表会认为你选择了这个节点而关闭popup,这样就会导致选择下一
子节点时由于找不到popup控件而报错。



  下拉树形列表控件对于OEA来说,是基础控件,自动化测试支持它那是必须的,而现在出现了这
种异常,我能做的只是去想办法去解决。由于对CodedUI内部没有进行学习,所以只能靠瞎猜测并快
速验证了,我想到了以下几种情况:

是否可以通过设置exe程序的兼容性来达到正确执行: 验证不通过,设置兼容性后仍然

[attach]111344[/attach]

是否可以选择一个节点后,再模拟点击一次控件再次弹出popup后再选择下一节点:验证不通过,即使通
过了这种方式也不好
更改Expand方法,改模拟按+展开为使用WpfTreeItem的Expand属性:验证不通过,仍旧不行
不使用CodedUI类库提供功能,直接使用Automation功能:考虑了一下,不想通过此方法进行,因为即使
可以找到,需要自己处理的东西还有很多,如EnsureClickable等,所以没有验证此方案
通过其他模拟输入方式来解决:这个也是最终方案,具体细节看下面介绍
最终方案:直接输入字符串赋值
  通过以上几种猜测,发现都试不通,都弄了快两天了,计划这周我就要搞定自动化测试框架,还需要
教给测试人员使用呢,我可没有时间再在这里纠结了,于是我放弃了通过下拉选择的实现方式,而改为通
过直接在控件输入字符串后按回车来赋值。

属性编辑器支持
修改OEA中的属性编辑器LookupListPropertyEditor,监听按回车事件来赋值
  1. void _cmbGrid_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
  2. {
  3.      //根据输入的Text来设置属性值
  4.      if (e.Key == Key.Enter)
  5.      {
  6.          this.LoadData(false);
  7.          if (!_cmbGrid.IsShowingTree)
  8.          {
  9.              foreach (var item in _cmbGrid.ItemsSource)
  10.              {
  11.                  if (item.GetPropertyValue<string>("Name") == _cmbGrid.Text)
  12.                  {
  13.                      _cmbGrid.SelectedItem = item;
  14.                      SetValueBySelectedItem();
  15.                      break;
  16.                  }
  17.              }
  18.          }
  19.          else
  20.          {
  21.              string[] nodes = _cmbGrid.Text.Split('/');
  22.              Guid? pid = null;
  23.              ITreeNode curNode = null;
  24.              foreach (var node in nodes)
  25.              {
  26.                  curNode = FindByName(node, pid);
  27.                  if (curNode == null) return;
  28.                  pid = (Guid)curNode.Id;
  29.              }
  30.              _cmbGrid.SelectedItem = curNode;
  31.              SetValueBySelectedItem();
  32.          }
  33.      }
  34. }
复制代码
  1. 脚本更改
  2. 1
  3. 2
  4. 属性编辑器("项目信息", :下拉列表).输入("江南四期1、4区项目")
  5. 属性编辑器("合同科目", :下拉树形列表).输入("建安工程类合同/建安工程和总包管理配合服务")
  6. 自动化测试框架更改



  7. class ComboBoxTestObject < TestObject
  8.   def 输入(str)
  9.     puts "输入:" + str
  10.     @test_control.DrawHighlight
  11.     edt = WpfEdit.new(@test_control)
  12.     edt.Text = str
  13.     Keyboard.SendKeys(edt, "{ENTER}")
  14.   end
  15. end
复制代码



作者: 海海豚    时间: 2018-3-5 14:46
谢谢分享~
作者: 梦想家    时间: 2018-5-14 08:49
学习




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2