用于丰富sproutcore应用程序的QA Automation

时间:2014-09-30 03:17:20

标签: ruby selenium automation sproutcore

我们使用sproutcore开发了丰富的UI应用程序。我们正在尝试使用Ruby中的Selenium webdriver自动化页面。通过动态生成的id和隐藏项,我们发现很难识别某些元素。申请很复杂。开发人员说他们无法为隐藏的项目或框架添加唯一的图层ID。对于静态页面,他们添加了唯一的图层ID或类名。

我想在这里向朋友们了解他们用于sproutcore应用程序的自动化程度是什么?  他们如何处理这些问题?

任何指针都表示赞赏。

3 个答案:

答案 0 :(得分:0)

即使网页元素

  

动态生成的ID和隐藏项目我们发现很难识别某些

一个解决方案是询问开发人员是否可以为他们添加命名模式,因此只需要生成即时的最后一个字符。通过这样做,您可以使用其中一些定位方法:

答案 1 :(得分:0)

与SproutCore一起使用的方法是使用SproutCore视图树来识别元素而不是层ID或类。例如,请考虑这个基本主页

MyApp.mainPage = SC.Page.create({

  mainPane: SC.MainPane.extend({

    childViews: ['header', 'mainContent', 'footer'],

    header: SC.ToolbarView.extend({
      layout: { height: 44 },

      childViews: ['headerButton'],

      headerButton: SC.ButtonView.extend({
        layout: { centerX: 0, centerY: 0, height: 40, width: 100 },
        title: "Click Here"
      })

    }),

    mainContent: SC.View.extend({
      layout: { top: 44, bottom: 33 },

    // etc.

虽然我们事先并不知道这些元素的图层ID,但我们确实知道他们在JavaScript中的父子关系。例如,如果我需要页面中的某些元素,我可能会提前抓住它们,

// Retrieve target views for the current page.
var mainPane = MyApp.mainPage.get('mainPane'),
  header = mainPane.get('header'),
  headerButton = header.get('headerButton'),
  // … etc.

// Then retrieve an element for acting upon.
var buttonLayer = headerButton.get('layer');  // returns a DOM node

// Or retrieve an element id for acting upon.
var buttonLayerId = headerButton.get('layerId');  // returns the auto-generated id

虽然我没有使用Selenium的第一手经验,但似乎您可以使用execute_script WebDriver实例方法运行一些简单的查找,这些查找返回您需要的元素或元素的ID需要。

最后,请记住,某些视图可能会动态更改子级,特别是SC.CollectionView子类,如SC.ListView。在这种情况下,一旦您定位父视图,您就可以使用特定于该父视图的方法(例如itemViewForContentIndex(idx))轻松访问您需要的子项,以获取列表的项目视图。

答案 2 :(得分:0)

我使用selenium自动化(通过Jenkins)Sproutcore app的一些 QA测试,根据我的经验,通常可以将特定的类名添加到Sproutcore对象然后使用xpath在Selenium中表达以定位这些类。

示例:

bottomRightView: SC.View.design({
        classNames: ["bottomRightView"],
        layout: { top: 60, width: 299, bottom:50, right: 15, zIndex: Maps.RIGHT_TOOL_BOX_PANE_ZINDEX },
        childViews: "resultsView noResultsView buttons featureView".w(),

Xpath表达式:

xpath=//div[contains(@class,'bottomRightView')]

始终可以使用 // @ if(debug)语句从生产版本中排除这些classNames。

上述应用程序的示例Selenium IDE脚本:https://github.com/unicolet/mappu/tree/master/tests/selenium