У меня проблема с заполнением этого словаря результатом из таблицы HTML. HTML выглядит примерно так:
<td class = "name">
<span data-bind = "text:'hierarchyId'"></span>
<span data-bind = "text:'name'"></span>
</td>
Я хочу заполнить словарь HiearchyId и именем для каждого td, но в итоге он заполняет только первый столбец, а во второй итерации возвращается ошибка, когда тот же идентификатор уже существует в словаре. Пожалуйста посоветуй.
public Dictionary<string,string> ListOfSections()
{
Dictionary<string,string> newDictionary = new Dictionary<string,string>();
IList<IWebElement> tdSectionName = sectionTable.FindElements(By.XPath("//td[@class='name']"));
foreach (IWebElement element in tdSectionName)
{
IWebElement hierarchy = element.FindElement(By.XPath("//span[@data-bind='text: hierarchyId']"));
IWebElement name = element.FindElement(By.XPath("//span[@data-bind='text: Name']"));
newDictionary.Add(hierarchy.Text, name.Text);
}
return newDictionary;
}
Вы также можете убедиться, что HTML правильный, мы не видим атрибут data-bind для диапазона.
ты прав. Я использую tdSectionName, но отредактировал код перед загрузкой. HTML не полный. Я просто хотел указать, что внутри одного элемента td есть два интервала, поэтому я набросал html. Но да, в html.Ty для вашего комментария есть атрибут привязки данных.





Добавьте .// к xpath, чтобы получить дочерний элемент, как показано ниже, или используйте селектор css:
public Dictionary<string,string> ListOfSections()
{
Dictionary<string,string> newDictionary = new Dictionary<string,string>();
IList<IWebElement> tdSectionName = sectionTable.FindElements(By.XPath("//td[@class='name']"));
foreach (IWebElement element in tdName)
{
IWebElement hierarchy = element.FindElement(By.XPath(".//span[@data-bind='text: hierarchyId']"));
IWebElement name = element.FindElement(By.XPath(".//span[@data-bind='text: Name']"));
newDictionary.Add(hierarchy.Text, name.Text);
}
return newDictionary;
}
Селектор CSS:
public Dictionary<string,string> ListOfSections()
{
Dictionary<string,string> newDictionary = new Dictionary<string,string>();
IList<IWebElement> tdSectionName = sectionTable.FindElements(By.CssSelector("td.name"));
foreach (IWebElement element in tdName)
{
IWebElement hierarchy = element.FindElement(By.CssSelector("span[data-bind='text: hierarchyId']"));
IWebElement name = element.FindElement(By.CssSelector("span[data-bind='text: Name']"));
newDictionary.Add(hierarchy.Text, name.Text);
}
return newDictionary;
}
Необходимо проверить, не являются ли иерархия и имя нулевыми!. это правда?
Объясните, что значит ноль?
Возможно, что родительский элемент не имеет дочернего элемента span[data-bind='text: HieraryId'] или span[data-bind='text: Name']?
@isaeid, ты должен это знать. Если не найдено, вы получите сообщение об ошибке
@runningman, вы можете использовать element.FindElements(By.CssSelector("span[data-bind='text: hierarchyId']")) и проверить размер. Если > 0, чем выход из элемента.
foreach (IWebElement element in tdName)следует ли использоватьtdSectionNameсписок? Я не знаю, откуда вы беретеtdName.