我正在尝试通过 WebBrowser 控件进行非常简单的自动化测试。有两个方面:具有不可触及代码的应用程序端和测试端,我正在生成它以进行点击自动化。
问题是单选按钮是在我试图测试的网页控件后面的代码中创建的 - 它们是 RadioButtonList 控件的一部分(使用 RBL.Items.Insert..)最重要的是,RadioButtonList 有获取 SelectedValue 的事件处理程序 OnSelectedIndexChanged。
我可以通过 WebBrowser 控件找到代码隐藏生成的单选按钮并设置以下内容:
HtmlElement subjectRadioButton = browser.Document.GetElementById("...");
if (subjectRadioButton != null)
{
subjectRadioButton.InvokeMember("click");
}
调试器显示我正在输入代码。此外,如果您不执行任何其他操作,您可以目视检查项目。另一方面,我正在测试的页面,但是,一旦发生回发,它就会进入事件处理程序。事件处理程序具有以下破坏代码:
int.Parse(rblSubject.SelectedValue);
rblSubject.SelectedValue 是空字符串,并且永远不会填充,无论我如何尝试调用 subjectRadioButton,它是 RadioButtonList 的一部分。我什至通过javascript尝试并确认checked=true。我认为这与单选按钮本身不与 RadioButtonList 同步有关,因为它是在后面的代码中动态创建的。更奇怪的是,全手动测试工作正常。它只是在做自动化的失败。我还注意到,如果我只是设置 InvokeMember("click"),则不会出现错误(不会发生回发)。它看起来确实检查过。然后当我在页面上的链接或按钮上执行 InvokeMember("click") 时,会发生回发,事件处理程序会触发并且我收到解析错误。提前非常感谢。
这是我正在测试的应用程序端的代码——我无法修改的代码,它初始化了 RadioButtonList rblSubject。
rblSubject.Items.Clear();
ListItem item;
if (obj <= 0)
{
item = new ListItem(GetObject("BillingIssue").ToString(), ((int)SubjectTypeEnum.BillingQuestion).ToString());
rblSubject.Items.Insert(0, item);
item = new ListItem(GetObject("ChangeNote").ToString(), ((int)SubjectTypeEnum.ChangeOfInformation).ToString());
rblSubject.Items.Insert(1, item);
item = new ListItem(GetObject("OtherAdmin").ToString(), ((int)SubjectTypeEnum.AdminNote).ToString());
rblSubject.Items.Insert(2, item);
}