2017-07-13 11 views
2

私はSeleniumを使っていて、テーブルから値を選択しようとしています。私は3回(3つの異なるテーブルに対して)行いますが、この値を繰り返すと、Seleniumは最初のテーブルから値を選択します。例えばSelenium C# - 間違ったテーブルからセルを選択しています

表1では、コードは、何の問題もそれを選択しない、値 "X123" があります。 テーブル2には、値「X123」もあります。 Seleniumが2番目のテーブルから値を選択しようとすると、最初のテーブルから値が選択されます。

それは、これらのテーブルの要素をマッピングするためには本当に難しい、それらはすべて同じ構造で構築されているので、私は次のように、そのためのXPathセレクターを選択しました:

[FindsBy(How = How.XPath, Using = "//div[@class='k-widget k-window' and not(contains(@style, 'display: none'))]//child::div[@class='col-md-4 col-md-offset-0'][1]//child::table[@data-role='selectable']")] 
    private IWebElement Table1 { get; set; } 

    [FindsBy(How = How.XPath, Using = "//div[@class='k-widget k-window' and not(contains(@style, 'display: none'))]//child::div[@class='col-md-4 col-md-offset-0'][2]//child::table[@data-role='selectable']")] 
    private IWebElement Table2 { get; set; } 

    [FindsBy(How = How.XPath, Using = "//div[@class='k-widget k-window' and not(contains(@style, 'display: none'))]//child::div[@class='col-md-4 col-md-offset-0'][3]//child::table[@data-role='selectable']")] 
    private IWebElement Table3{ get; set; } 

をセルを選択するために使用される関数がされ:

public static void SelectMultipleGridCell(this IWebElement table, string value) 
    { 
     IList<IWebElement> tableRow = table.FindElements(By.XPath("//tr//td[text()='" + value + "']")); 
     new WebDriverWait(GeneralProperties.Driver, TimeSpan.FromSeconds(5)) 
      .Until(ExpectedConditions.ElementExists(By.XPath("//tr//td[text()='" + value + "']"))); 
     foreach (IWebElement row in tableRow) 
     { 
      if (row.IsVisible()) 
      { 
       new Actions(GeneralProperties.Driver).KeyDown(Keys.Control).Click(row).KeyUp(Keys.Control).Build().Perform(); 
       break; 
      } 
     } 
    } 

この機能を使用する他のすべての条件の場合、テーブル(複数のセルを1つだけ選択するなど)で機能します。値を繰り返しても、期待どおりに機能しません。私のコードが間違っているのですか、それについてSeleniumにいくつかの制限がありますか?

ご協力いただけると助かります。

答えて

2

子孫を検索するには、XPathの前にドットを追加する必要があります。それ以外の場合は、ルートから検索します。

public static void SelectMultipleGridCell(this IWebElement table, string value) 
{ 
    IList<IWebElement> tableRow = table.FindElements(By.XPath(".//tr//td[text()='" + value + "']")); 

    foreach (IWebElement row in tableRow) 
    { 
     if (row.IsVisible()) 
     { 
      new Actions(GeneralProperties.Driver).KeyDown(Keys.Control).Click(row).KeyUp(Keys.Control).Build().Perform(); 
      break; 
     } 
    } 
} 
+0

お返事ありがとうございます!私はテストに合格し、動作しませんでした..それはまだ最初のテーブルから値を選択しています。 –

+0

このエラーは、あなたが記述している問題とは関係なく、XPathの前にあるドットに関係しているかどうかは疑問です。 –

+0

申し訳ありませんが、私は自分自身を間違って表現しました(気がついたら私のコメントを変えてしまった)。行動はまだ間違っています。要素が示すように、2番目のテーブルから値を選択する必要がありますが、最初のテーブルから選択しています –

関連する問題