2017-10-13 31 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

相關問題