2017-10-13 33 views
0

我知道这是一个重复的问题,但我没有得到它的解决方案,因此再次要求它。不一致的错误:元素没有附加到页面文件

我正在使用硒C#并获取上述错误的情况下在同一页上的同一行动的测试。 我的测试在我的本地机器上正常工作,但当我通过TFS在服务器上执行时,相同的测试不一致。

我在测试中进行了更改,因为它是在单击操作后重新加载DOM,现在我在重新加载其在本地机器上正常工作但在服务器上不一致时检查对象。 我需要取消选中复选框,如果他们被选中。 我在包含此CB的表格上使用“.//*[@type='checkbox']”获得了一组复选框(CB)。

但是,这是产生相同的错误,所以我改变了我的方法,后来是从复选框旁边的文本geet个人复选框,但这种方式是不一致的,并在我的本地机器上,但不是在服务器上。

不确定这种情况发生的方式。 ,我需要做多次测试这个动作,所以我写了一个共同的功能,取消CB

以下是HTML的被点击复选框

<tr> \t <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> \t <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> \t <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(); 
      } 
     } 

这在我的本地机器上正常工作,但不能在服务器上工作。 ,并且在一些随机运行中,它在一次测试中执行,而在其他测试中失败。

不知道为什么会发生这种情况。

感谢, amey

回答

1

这是自动化测试,陈旧的元素例外非常著名的错误,你不应该在一个循环,可以改变页面中使用对象的列表/数组/集合。

当页面发生变化时,所有当前对象都没有绑定到对象页面,因为它们不是同一个对象。

您需要在每次单击之前查找元素。

您应该使用do-whileif,应该像(我还没有和C#的工作,所以你可能需要做一些改变)

do 
    string checked = driver.FindElement(By.XPath(xPath_for_checked)); 

    if (checked != null) 
     { 
      checked .Click(); 
     } 

while (checked != null) 

和选择应该是:

XPath的://input[contains(@id, 'ContentPlaceHolder')][@checked]

CSS:input[id*=ContentPlaceHolder][checked]

+0

我同意你说的话,但如果在OP的代码你看到页面改变或刷新? – IamBatman

+0

是的,这就是我的第二种方法。我正在创建一个我用来查找复选框对象的字符串列表。仍然失败 e = driver.FindElement(By.XPath(xPath)); string isChecked = e.GetAttribute(“checked”); 对此提供错误 – Amey

+0

页面可能会在'e.Click();'中更改。您在'foreach'中使用'ele1',检查使用FindElements的地方,另一个问题可能是所有元素都没有'checked'属性,请注意这一点。 – lauda

相关问题