2017-07-13 4 views
2

私はSelenium WebDriverを数週間使っていますが、私のプロジェクトはほぼ完了していますが、Selenium C# - 「ロケータで」のない要素が存在する

[FindsBy(How = How.XPath, Using = "//div[@class='k-widget k-window' and not(contains(@style,'display: none;'))]//button[text()='Confirmar']")] 
    private IWebElement GenericConfirmButton { get; set; } 
:私のプロジェクトで

が、私はクラスですべてのものを分け、私は私の要素を入れてクラスがあります、次の例のように宣言(と同じクラスで、私は私のテストで実装された機能を置きます)

:は以下のコードを(その別のクラスで)実行

private void ClickConfirmButtonIfVisible() 
    { 
     if (GenericConfirmButton.IsVisible()) 
      GenericConfirmButton.SetClick(); 
    } 

機能のisVisible():

私の機能の一つであります

public static bool IsVisible(this IWebElement element) { try { new WebDriverWait(GeneralProperties.Driver, TimeSpan.FromMilliseconds(0)) .Until(ExpectedConditions.ElementToBeClickable(element)); if (element.Enabled && element.Displayed) { return true; } else return false; } catch (WebDriverTimeoutException) { return false; } } 

私の問題は次のとおりです。この関数IsVisible()は、(要素が存在しない場合)実行に約5秒かかります。私の目的は、ボタン "Confirmar"を押した場合、要素が存在するかどうかを確認し、そうでない場合は、を返します。

私はすでにElementExists代わりのElementToBeClickableを使用しようとしましたが、私はIWebElement要素を宣言するためにseparetedクラスを使用すると、この機能は、ことで宣言が必要なので、私は(それを行う方法がわかりません)。私はElementExistsを使用したいと思います(私は今よりも速く動くと信じています)。あなたが他の方法を知っていて、私を助けることができたら、私は本当にそれを前立てます。

それだけです。ありがとう!

+0

代わりにXPathセレクタをCSSセレクタに置き換えてみましたか?この記事では、CSSセレクタのパフォーマンスがより良いことを示唆しています。 http://elementalselenium.com/tips/32-xpath-vs-css – DaveRead

+0

私がテストを行っているサイトの要素は99%動的であるため、私が行ったすべての研究では、XPathセレクタを使用するようになっています。 とにかくCSSセレクタを試してみます。ありがとう! –

+1

これは直ちに復帰すれば厳しいです...もしあなたが0.5秒待っていれば要素が存在するでしょうか?これは、一般に、私がテストロジック内のif文を避けようとする理由です。目に見えるかどうかを知るロジックを書くことができれば(これはテストケースで知っておくべきことです)、それはあなたがすべきことです。私にとって、これは賢明にしようとしているテストロジックの兆候であり、一般的には欲求不満につながります。 – mrfreester

答えて

3

コードのどこかにドライバImplicitlyWaitと設定しているので、5秒間待機しています。これを取り除くことはできますが、暗黙の待機に依存する他のテストがある場合、影響を受ける可能性があります。

一般的に言って、私は部分的に予期せぬ待ち時間が明示暗黙の待機を組み合わせることでan issueに行う、唯一明示的な待機を使用してお勧めします。

この問題はロジック内のif文を避けてテストロジックが賢明にならないようにすることによっても回避できます。この場合、基本的にテストケースにボタンがあるかどうかを知る必要があるため、ロジックに反映させる必要があります。

関連する問題