Selenium C# - 它从错误的表中选择一个单元格

时间:2017-07-13 17:13:36

标签: c# selenium xpath webdriver

我是使用Selenium的新手,我试图从表格中选择一个值。我做了3次(对于3个不同的表)但是如果重复这个值,Selenium会从第一个表中选择值。

例如:

表1 中,有一个值" X123",代码选择它,没问题。 在表2 中,还有一个值" X123"。当Selenium尝试从第二个表中选择值时,它最终会从第一个表中选择值。

映射这些表的元素真的很难,它们都是在相同的结构中构建的,所以我选择了XPath Selector,如下所示:

    [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;
            }
        }
    }

对于使用此功能的所有其他条件,它工作正常(在表中选择多个单元格,只有一个,等等)。如果重复该值,它只能按预期工作。我的代码是错的还是Selenium对此有一些限制?

任何帮助都不胜感激。

1 个答案:

答案 0 :(得分: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;
        }
    }
}