2017-07-31 8 views
1

私はセレンを介して実行しているいくつかのテストがあります。いずれかが失敗したときは、要素が見つからないというテストを取り巻くキャッチがあります。セレンの要素が見つかりませんエラーログ

代わりにかなり曖昧なように見えますが、どの要素が見つからないのか、それをエラーログに書き込むことができるようにしたいと考えています。どの要素が見つからないのかを判断する方法はありますか?

ここで私のエラーをキャッチするために使用しているいくつかのコード例を示します。

try 
{ 
    base.SetUp(); 

    webDriverWait.Until(ExpectedConditions.ElementTo‌​BeClickable(
     excelSession.FindElementByName("Blank workbook"))).Click(); 
    webDriverWait.Until(ExpectedConditions.ElementTo‌​BeClickable(
     excelSession.FindElementByName("Create"))).Click(); 
    webDriverWait.Until(ExpectedConditions.ElementTo‌​BeClickable(
     excelSession.FindElementByName("New"))).Click(); 
    webDriverWait.Until(ExpectedConditions.ElementTo‌​BeClickable(
     excelSession.FindElementByName("E Sample Data"))).Click(); 

    CommonMethods.IsElementDisplayed(excelSession, 
     new StackTrace(true).GetFrame(0).GetFileLineNumber(), 
     new StackTrace(true).GetFrame(0).GetMethod(), "CreateErrorIcon", 
     "Error appeard while selecting the E Sample Data button"); 
} 
catch (Exception) 
{ 
    CommonMethods.ExceptionHandler("Couldn't find element", 
     new StackTrace(true).GetFrame(0).GetFileLineNumber(), 
     new StackTrace(true).GetFrame(0).GetMethod(), excelSession); 
} 
+0

オプションは、ログに例外メッセージを書くことですワン。例外メッセージは、使用されたロケータを示します。 – JeffC

答えて

2

要素を検索する機能を宣言します。

Func<RemoteWebDriver, By, IWebElement> find = (driver, by) => 
{ 
    var elements = driver.FindElements(by); 
    if (elements.Count < 1) 
    { 
     var msg = $"Couldn't find element {by}"; 
     logger.Warn(msg); 
     throw new Exception(msg); 
    } 

    return elements.First(); 
}; 

次に、このようにそれを使用します。

webDriverWait.Until(
    ExpectedConditions.ElementTo‌​BeClickable(
    find(excelSession, By.Name("Blank workbook"))) 
).Click(); 
+0

フィードバックをお願いします。私のコードは動作しませんか?私は質問を誤解しましたか?この答えに何が間違っていますか? –

+0

アイデアは悪くないが、実装に問題がある。 'FindElementsByName()'が定義されていません。 OPは単数で使用した。あなたは 'if-else'に論理的な問題があります。あなたは' else if'を全く必要としません。 '.Count == 0'ならば最初の要素を返してください。 '文字列'の代わりに 'By'ロケータを渡すほうがずっと良いでしょう。私はOPが文字列を使用したことを知っていますが、それは良い方法ではありません。 'By 'はずっと柔軟です。 – JeffC

+0

@JeffCフィードバックいただきありがとうございます、私は私の答えを更新しました。私はSelenium "3.4.0.0"を使用していて、 'FindElementsByName'は' OpenQA.Selenium.Remote.RemoteWebDriver'クラスで定義されています –

関連する問題