我是使用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对此有一些限制?
任何帮助都不胜感激。
答案 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;
}
}
}