2012-04-17 5 views
0

Webページにレコードのコレクションがあり、レコードをクリックすると「削除」リンクが表示されます(実際には常に非表示になっています) 。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によって見つける方が良いでしょう。リンクがあれば、そのプロパティの名前がわかります。 –

+0

1%であっても、これを複数回呼び出すと雪だるま効果が生成されます。次のことは、数分ではなく数時間かかるビルドがあることを知っていることです。 –

+0

同じテストでこのメソッドを100回呼び出しても、サーバーが1ページをレンダリングするのに要する時間はほんのわずかです。ビルド時間を改善するには、実際に時間がかかる部品を測定して最適化します。この方法はそれではありません。 –

答えて

1

私はあなたが最適化あなたの時間を過ごす場所について疲れなければならないこと@Torbjornに同意するが、私はこのコードは少し非効率的であると思います。

基本的には、各要素を表示するかどうかを確認する前後のチェックです。コードをスピードアップするには、必要な要素を一度に取得する必要があります。

つのオプション(両方ではJavaScriptを伴う):

jQueryの

がセレンにjQueryのセレクタをもたらすためのさまざまな方法を見てみましょう(私はそれhereについて書きました)。いったんそれができたら、jQueryの:visibleセレクタを利用することができます。あなたは確かに知っている場合

またページは、すでにjQueryがロードされている、あなたは、あなたは、単にExecuteScript使用することができ、すべての余分なコードを行うにはしたくない:

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

Javascriptを

の場合あなたは、あなたが今C#でやっているのと同じことを行うためのjavascript関数を書くことができますjQueryを避けたい:すべての可能な要素を取得し、最初の目に見えるものを返します。あなたが選ぶが、それらはすべて、より効率的であるべきオプションに応じて異なる程度で可読性の

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

あなたの貿易:

その後、同様の何かをするでしょう。もちろん、これらはすべてブラウザでjavascriptを有効にする必要があります。

関連する問題