【发布时间】:2018-03-25 15:07:22
【问题描述】:
我知道这是一个重复的问题,但我没有得到解决方案,因此再次询问。
我正在使用 selenium C# 并在同一页面上的同一操作中获得上述错误以进行情侣测试。 我的测试在我的本地机器上运行良好,但是当我通过 TFS 在服务器上执行时,相同的测试不一致。
我在测试中进行了更改,因为它在单击操作后重新加载了 DOM,现在我在重新加载后检查对象,它在我的本地机器上工作正常,但在服务器上不一致。 如果选中,我需要取消选中复选框。 我在包含此 CB 的表上使用“.//*[@type='checkbox']”获取复选框(CB)组。
但这产生了同样的错误,所以我改变了我的方法,后来从与复选框相邻的文本中获取单个复选框,但这种方式不一致,并且在我的本地机器上工作,但不在服务器上。
不确定这是怎么回事。 我需要在多个测试中执行此操作,所以我编写了一个通用函数来取消选中 CB
以下是要单击的复选框的 HTML
<tr> <td>
<input id="ContentPlaceHolder1_cblModules_0" type="checkbox" name="ctl00$ContentPlaceHolder1$cblModules$0" checked="checked" onclick="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$cblModules$0\',\'\')', 0)" value="0"><label for="ContentPlaceHolder1_cblModules_0">Collector</label>
</td>
</tr>
<tr> <td>
<input id="ContentPlaceHolder1_cblModules_1" type="checkbox" name="ctl00$ContentPlaceHolder1$cblModules$1" onclick="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$cblModules$1\',\'\')', 0)" value="1">
<label for="ContentPlaceHolder1_cblModules_1">Maintenance</label>
</td>
</tr>
<tr> <td>
<input id="ContentPlaceHolder1_cblModules_2" type="checkbox" name="ctl00$ContentPlaceHolder1$cblModules$2" onclick="javascript:setTimeout('__doPostBack(\'ctl00$ContentPlaceHolder1$cblModules$2\',\'\')', 0)" value="2">
<label for="ContentPlaceHolder1_cblModules_2">Manager</label>
</td>
</tr>
我尝试过的第一种方法
string checkboxList = ".//*[@id='ContentPlaceHolder1_cblModules' and @class = 'checkBoxList']";
IWebElement e1 = SeeElement.GetElement(driver,checkboxList);// internal function to get element
string CBchecked =".//*[@type='checkbox']";
IReadOnlyCollection<IWebElement> ele1 = e1.FindElements(By.XPath(CBchecked));
foreach (IWebElement e in ele1)
{
string isChecked = e.GetAttribute("checked");
if (isChecked != null)
{
e.Click();
}
}
在这里我遇到了同样的错误,所以我将方法更改为
List<string> checkedItems = new List<string>();
string checkboxList = ".//*[@id='ContentPlaceHolder1_cblModules' and @class = 'checkBoxList']";
string CBchecked = checkboxList+"//input[@type='checkbox']/following-sibling::label";
IReadOnlyCollection<IWebElement> ele1 = driver.FindElements(By.XPath(CBchecked));
foreach (IWebElement e in ele1){ checkedItems.Add(e.Text); }
foreach (string s in checkedItems)
{
string xPath;
xPath = "//*[text()='" + s + "']/preceding-sibling::input[@type='checkbox']";
IWebElement e;
e = driver.FindElement(By.XPath(xPath));
string isChecked = e.GetAttribute("checked");
if (isChecked != null)
{
e.Click();
}
}
这在我的本地机器上运行良好,但在服务器上运行不正常。 并且在一些随机运行中,它在一个测试中执行,而在另一个测试中失败。
不知道为什么会这样。
谢谢, 艾米
【问题讨论】:
标签: c# html selenium selenium-webdriver tfs