2015-02-11 18 views
0

確定要爲我們的Web應用程序編寫testmonkey。這隻猴子應該在log中隨機開始輸入數值並點擊webelements從Se中的元素中找到一個定位器

到目前爲止,我已經能夠登錄,找到webelements(篩選它們),然後隨機選擇一個並單擊它。儘管我點擊了一次隨機數,但我碰到了StaleElementReferenceException。爲此我的所有解決方案都能找到建議我等待元素,或者我再次找到它。不幸的是,我沒有元素的定位器或路徑,我只有元素本身。

我的代碼如下所示:

public void Start() 
{ 
    List<IWebElement> elements = _seleniumAdapter.AllElementsOnPage(); 
    Debug.WriteLine("Elementcount: " + elements.Count); 
    IWebElement element = elements[_random.Next(elements.Count)]; 

    Debug.WriteLine(element.TagName + "," + element.Text); 

    element.Click(); 
    if (element.GetAttribute("type").Contains("text")) 
    { 
     Debug.WriteLine("text!"); 
     element.SendKeys(randomLetter()); 
    } 
    Start(); 

} 

有沒有什麼方法可以讓我得到StaleElementReference身邊? AllElementsOnPage查找元素By.CssSelector("*"),然後在返回之前過濾該列表,以便僅留下可點擊的元素。

我們的應用中的元素大部分時間都沒有ID,所以我不能使用它。我也沒能找到任何我可以用作獨特選擇器的屬性。

我難倒。

+0

我不會說這是一個非常可行的方法來做到這一點。 CSS選擇器將根據包含**隱藏**元素的頁面大小返回元素的TONS。請記住,硒將無法與隱藏的元素進行交互。會有一些確實無法點擊的元素。並且'Dom'刷新是您現在正面臨的問題我現在使用 – Saifur 2015-02-11 13:03:29

+0

Th AllElementsOnPage返回一個已過濾的列表。隱藏的元素和無法與之交互的內容會被過濾掉,這樣我就可以保留一小堆可點擊和可測試的內容。 – Steve 2015-02-16 13:07:52

回答

0

將_random.Next爲您生成的索引存儲在變量中。例如我。

然後在代碼中進行更改以捕獲StaleElementReferenceException。在Catch塊中,您可以再次填充您的列表並找到具有_random.Next爲您生成的相同索引的元素。 嘗試在catch塊中再次單擊它。如果仍然無法點擊,請在第二個catch塊中再次捕獲它,並記錄此元素的屬性並轉到下一個元素。之後你可以檢查這個元素究竟有什麼問題。請參閱下面更改的代碼。

public void Start() 
    { 
     List<IWebElement> elements = _seleniumAdapter.AllElementsOnPage(); 
     Debug.WriteLine("Elementcount: " + elements.Count); 
     int i = _random.Next(elements.Count); 
     IWebElement element = elements[i]; 

     Debug.WriteLine(element.TagName + "," + element.Text); 
     try 
     { 
     element.Click(); 
     } 
     catch(StaleElementReferenceException ex) 
     { 
      elements = _seleniumAdapter.AllElementsOnPage(); 
      element = elements[i]; 
      element.Click() 

     } 
     catch(Exception ex) 
     { 
      Debug.WriteLine(ex.Message); 
      element = null; 
     } 
     if(element != null) 
     { 
     if (element.GetAttribute("type").Contains("text")) 
     { 
      Debug.WriteLine("text!"); 
      element.SendKeys(randomLetter()); 
     } 
     Start(); 
     } 

    } 

這種方法性能密集,但它會完成任務。我希望。

+0

謝謝joinsaad!這將工作出色! – Steve 2015-02-26 08:20:20

相關問題