C# MSTEST 编码 UI 自动测试失败,而相同的手动测试通过

C# MSTEST Coded UI Automated Test Fails While Identical Manual Test Passes

我在 Google 上搜索过、Binged 过、Yahood 过,甚至 Dogpiled 过。我发现大多数 Python、PHP 和 Ruby 不适用。仅显示一项(自 2012 年起)但没有答案:unit test fails in r# but passes in mstest

我有两个测试与记录的完全一样。一方面,当测试到达“提交”按钮时,应用程序表示页面尚未准备好提交并且“提交”按钮保持禁用状态。对于另一个,提交按钮已启用,但页面不执行任何操作。当我 运行 使用相同的数据(或不同的数据)手动(使用键盘和鼠标)执行完全相同的操作时,两个页面上的提交按钮都有效并且两个页面都在处理。

我已经 运行 测试到单击提交按钮的程度,但是当我手动单击它们时也没有任何反应。我从一个字段切换到下一个字段,认为这可能是一个没有触发的事件,但没有。

这是我的发现:如果自动打开页面,提交按钮将不起作用。如果自动输入或选择了页面上的一项,提交按钮将不起作用。但是:如果我 运行 自动化到页面打开之前的那个点,那么如果我单击打开页面并手动键盘和鼠标输入条目,然后手动鼠标单击提交按钮,它将起作用。

测试记录在 MTM 中并导入到 Visual Studio 2012。我尝试重新导入它们,并且我使用 Visual Studio.

手动记录了这些步骤

我们现在认为测试软件 (MSTest) 和页面中的 JavaScript 之间存在一些意外的交互。我们已经对应用程序中的其他 11 个页面进行了编码 (Coded UI)。所有 11 个应用程序页面都使用相同的基本架构和相同的控件。我们的测试人员认为 JavaScript 可能已损坏(缺少右大括号、缺少一对括号、缺少分号、错误位置的换行符等)。

这些测试绝对没有什么独特之处。它们是我编写过的最简单的测试之一。其中之一只有四个输入字段。我没有手动编码; UIMap.cs 文件为空。全部在 UIMap.Designer.cs 中,基于 UIMap.UITest 文件。

这是我的编码 UI 测试 Class 的重要部分(省略了变量设置和 try-catch 逻辑):

try
{
  User.OpenBrowser(TestContext);
  this.UIMap.ClickFeesButtonInSecondaryMenu();
  this.UIMap.ClickAddPaymentButton();
  this.UIMap.OpenYearDropdownAndSelect2016();
  this.UIMap.Type1234InCheckNumber();
  this.UIMap.Type275InTotalAmount();
  this.UIMap.SelectBusinessFees();
  this.UIMap.SelectInstructorFees();
  this.UIMap.ClickSubmitButton();
  User.CloseBrowser(TestContext);
}
catch . . . . 

这是我的一部分 UIMap.Designer.cs:

public void ClickFeesButtonInSecondaryMenu()
{
    #region Variable Declarations
    HtmlHyperlink uIFeesHyperlink = this.UIInternetExplorerWindow.UIDocument.UIFeesHyperlink;
    #endregion

    // Click 'Fees' link
    Mouse.Click(uIFeesHyperlink, new Point(22, 21));
}

public void ClickAddPaymentButton()
{
    #region Variable Declarations
    HtmlHyperlink uIAddPaymentHyperlink = this.UIInternetExplorerWindow.UIDocument1.UIAddPaperPaymentHyperlink;
    #endregion

    // Click 'Add Payment' link
    Mouse.Click(uIAddPaymentHyperlink, new Point(84, 15));
}

    public void OpenYearDropdownAndSelect2016()
    {
        #region Variable Declarations
        HtmlHyperlink uIItem2017Hyperlink = this.UIFeeInternetExplorerWindow.UIFeeDocument.UIItem2017YearYearPane.UIItem2017Hyperlink;
        HtmlDiv uIItem2016Pane = this.UIFeeInternetExplorerWindow.UIFeeDocument.UIItem2016Pane;
        #endregion

        // Click '2017' link
        Mouse.Click(uIItem2017Hyperlink, new Point(149, 20));

        // Click '2016' pane
        Mouse.Click(uIItem2016Pane, new Point(124, 3));
    }

    public void Type1234InCheckNumber()
    {
        #region Variable Declarations
        HtmlEdit uICheckNumberEdit = this.UIFeeInternetExplorerWindow.UIFeeDocument1.UICheckNumberEdit;
        #endregion

        // Type '1234' in 'Check Number' text box
        uICheckNumberEdit.Text = this.Type1234InCheckNumberParams.UICheckNumberEditText;
    }

。 . .等等,直到你到达。 . .

public void ClickSubmitButton()
{
    #region Variable Declarations
    HtmlInputButton uISubmitButton = this.UIFeeInternetExplorerWindow.UIFeeDocument1.UISubmitButton;
    #endregion

    // Click 'Submit' button
    Mouse.Click(uISubmitButton, new Point(27, 17));
}

我只做了一年多的 C# MSTEST Coded UI,但我这里还有其他三个自动化人员,他们的经验比我多得多,这个问题对我们所有人来说都是新问题。我们已经看过我们能想到的一切,但没有快乐。有人见过这个吗?是什么导致了这种行为?最重要的是,有解决办法吗?

因为您提到您认为 JS 可能已损坏,这让我相信点击按钮后可能在后台发生某种 AJAX。如果是这种情况,请参阅 this question 以了解它是否适​​用于您的情况。