Попила крови у меня эта переменная, а всё потому что надо тестировать сразу, а не ждать пока накопится ещё сотня строк кода. Потом в этой каше на порядок сложнее отыскать проблему.
К сути. Напрямую обратиться к переменной внутри xPath в C# нельзя, хотя согласно спецификации самого xPath такая возможность должна быть ($var).
int i = 1;
string test = tab.FindElementByXPath("//table/tbody/tr[$i]/td[1]/div/a", 0).InnerHtml;
return test;
При любых значениях
i будет выкидывать исключения.
Просто подставить строку в селектор тоже нельзя как оказалось. По непонятным для меня причинам (разбираться лень) селектор всегда примет значение "1".
int i = 1;
string test01 = tab.FindElementByXPath("//table/tbody/tr[\"+i+\"]/td[1]/div/a", 0).InnerHtml;
string test02 = tab.FindElementByXPath("//table/tbody/tr[\"i\"]/td[1]/div/a", 0).InnerHtml;
string test03 = tab.FindElementByXPath("//table/tbody/tr[1]/td[1]/div/a", 0).InnerHtml;
Во всех трёх примерах xPath будет ссылаться на одну и ту же строку таблицы - первую. В этом для меня была большая подстава, т.к. счётчик начинался именно с единицы, первая итерация выдавала нужное значение, счётчик увеличивался, а значение
+i+ оставалось прежним (==1) и поиск продолжался в той же строке.
Т.е.
int i = 9;
string test01 = tab.FindElementByXPath("//table/tbody/tr[\"+i+\"]/td[1]/div/a", 0).InnerHtml;
i = 13;
string test02 = tab.FindElementByXPath("//table/tbody/tr[\"i\"]/td[1]/div/a", 0).InnerHtml;
string test03 = tab.FindElementByXPath("//table/tbody/tr[1]/td[1]/div/a", 0).InnerHtml;
и в test01, и в test02, и в test03 xPath сошлётся на первую строку таблицы, а никак не на 9-ю или 13-ю.
Обратиться к переменной в xPath в C# можно с помощью метода
String.Format, или придётся подключать сторонние библиотеки.
К примеру, у нас есть таблица где-то на просторах сети:
1 | ЦСКА | 10 | 24 |
2 | Зенит | 9 | 23 |
3 | Спартак | 10 | 23 |
4 | Локо | 9 | 22 |
... | ... | ... | ... |
99 | Команда | Игр | Очков |
[TBODY]
[/TBODY]
Нам нужно забрать значение игр-очков только для определённых команд (например, с 4 по 7 места) и записать всё в свою таблицу.
// Подключаем итоговую excel-таблицу, в которую будем записывать спарсенные значения.
IZennoTable table = project.Tables["resultTable"];
// Заводим счётчики: "a" для парсинга нужных строк в маске xPath, счётчик "i"
// для текущей строки результирующей таблицы.
int i = 0;
int a = 4;
while (a <= 7)
{
// Делаем приведение для возможности использования значения "a" в методе String.Format.
string w = a.ToString();
// Маску xPath создаем с помощью метода String.Format
// Парсим нужные показатели, объединяем их по маске метода Concat и пишем в нужную ячейку результирующей таблицы.
string team = tab.FindElementByXPath(String.Format("//table/tbody/tr[{0}]/td[2]/div/a", w), 0).InnerHtml;
string games = tab.FindElementByXPath(String.Format("//table/tbody/tr[{0}]/td[3]/div/a", w), 0).InnerHtml;
string scores = tab.FindElementByXPath(String.Format("//table/tbody/tr[{0}]/td[4]/div/a", w), 0).InnerHtml;
string result = string.Concat(team, ": ", games, " (", scores, ")");
table.SetCell(1, i, result);
// Увеличиваем счётчики.
i++;
a++;
}
project.SendInfoToLog("Список готов!");
Результирующая таблица будет иметь вид
значение | Локо: 9 (22) |
значение | Торпедо: 9 (21) |
значение | Динамо: 9 (21) |
значение | Амкар: 9 (20) |
[TBODY]
[/TBODY]