2012-04-17 127 views
0

我有一個網頁上的記錄集合,並且當單擊一條記錄時,會顯示一個'Delete'鏈接(實際上是'unhidden',因爲它實際上總是存在) 。只使用C#中的Selenium WebDriver查找非隱藏元素

當試圖訪問這個'刪除'鏈接時,我正在使用它的值。

當我使用Driver.FindElement,它返回第一刪除鏈接,即使它是隱藏的,因此不能點擊它(和不應該,因爲它是不正確的鏈接)。

那麼,我基本上想要做的只是找到非隱藏的鏈接。下面的代碼工作正常,但是當它遍歷每個刪除鏈接時,我擔心它可能效率低下。

有沒有更好的方法?

public class DataPageModel : BasePageModel 
{ 
    private static readonly By DeleteSelector = By.CssSelector("input[value=\"Delete\"]"); 

    private IWebElement DeleteElement 
    { 
     get 
     { 
      var elements = Driver.FindElements(DeleteSelector); 
      foreach (var element in elements.Where(e => e.Displayed)) 
      { 
       return element; 
      } 
      Assert.Fail("Could not locate a visible Delete Element"); 
      return null; 
     } 
    } 
} 
+0

硒測試很慢,所以這段代碼可能不會將執行時間增加1%......我會更擔心代碼的可讀性:意圖交流。你正在尋找一個特定的鏈接或任何非隱藏的刪除鏈接。如果一個具體的,它會更好地找到Id。如果有任何鏈接,我會爲該物業找到更好的名稱。 – 2012-04-17 05:51:45

+0

即使它只有1%,當你多次調用它時,它也會產生雪球效應。接下來的事情你知道你有一個需要幾小時而不是幾分鐘的構建。 – 2012-04-17 06:00:38

+0

即使您在同一測試中調用此方法100次,它可能只需要您的服務器渲染一頁所需的時間的一小部分。爲了縮短構建時間,測量和優化實際需要很長時間的部件。這種方法不會。 – 2012-04-17 06:27:41

回答

1

雖然我@Torbjorn同意,你應該感到厭倦約你花你的時間優化,我認爲這個代碼是有點低效率的。

基本上,減慢代碼的速度是每個元素的來回檢查,看它是否顯示。爲了加速代碼,你需要一口氣獲得你想要的元素。

兩個選項(都涉及到的JavaScript):

jQuery的

看看不同的方法,把jQuery選擇到硒(我寫它here)。一旦你有了,你可以使用jQuery的:visible選擇器。

或者,如果你肯定知道的網頁已有的jQuery加載,你不想做的所有額外的代碼,你可以簡單地使用ExecuteScript

IWebElement element = (IWebElement)driver.ExecuteScript("return $('input[value=\"Delete\"]:visible').first().get(0)"); 

的Javascript

如果你想避免jQuery,你可以只寫一個javascript函數來做和你現在在C#中一樣的事情:獲取所有可能的元素並返回第一個可見的元素。

,那麼你會做同樣的事情:它根據您選擇哪個選項,但他們都應該是更有效的不同程度的可讀性

string script = //your javascript 
IWebElement element = (IWebElement)driver.ExecuteScript(script); 

你交易。當然,這些都需要在瀏覽器中啓用JavaScript。

相關問題