Если текст содержит “программа на C#”, то код нажимает на ссылку.
private void button4_Click(object sender, EventArgs e)
{
List<IWebElement> Element = Browser.FindElements( By.CssSelector("#tabnews_newsc a") ).ToList();
for (int i = 0; i < Element.Count; i++ )
{
String s = Element[i].Text;
if (s.Contains("программа на C#")) // если текст СОДЕРЖИТ
{
Element[i].Click(); // КЛИК по новости, которая СОДЕРЖИТ искомый текст
break;
}
}
}
ВОПРОС
Как сделать, чтобы поиск осуществлялся без учёта регистра текста для поиска?
Т.е. если текст содержит “программа на C#”, то переход осуществляется, а если текст содержит “Программа на C#” (слово “Программа” с большой буквы “П” ), то перехода по ссылке не происходит.
При использовании предложенной вами строчки появляется ошибка.
ОШИБКА
‘string’ does not contain a definition for ‘contains’ and no extension method ‘contains’ accepting a first argument of type ‘string’ could be found (are you missing a using directive or an assembly reference?)
//h3//a[contains(lower-case(.), "программа на c#")]
Не уверен на счет #xpath сделал его на основе вашего #css-selectors . Делаете поиск элементов по этому xpath. У вас будет в итоге список элементов которые только содержат такой текст, соответственно обходите этот список и кликаете по каждому элементу или что там у вас делает тест)
List<WebElement> elements = driver.findElements(By.cssSelector("#tabnews_newsc a"));
for (WebElement ls : elements)
{
if (ls.getText().equalsIgnoreCase("программа на C#")) // если текст СОДЕРЖИТ
{
ls.click(); // КЛИК по новости, которая СОДЕРЖИТ искомый текст
}
}
Так же добавлю, что lower-case это XPath 2.0 - который в данный момент не поддерживается браузерами.
А точка это не text(), а текущая нода относительно предиката…
Настолько хорошо, насколько их поддерживает веб-браузер.
В принципе, уже видно, что существует несколько путей решений задачи топикстартера. Лично мне вариант с прямым поиском по XPath видится самым производительным, так как сразу формируется массив из нужных элементов. В вашем же случае сперва сформируется массив из всех ссылок, а потом он еще должен перебираться, сравнивая каждый элемент с шаблоном регулярного выражения.
Ясен пень оно будет работать по разному ) Я не утверждал что . == text(), я имел в виду что в некоторых случаях замена text() на . будет давать тот же результат. Мне так удобнее было записать пример и все. Главное что он работает.
Ну если для вас все ясно, расскажите топик-стартеру, что же просиходит к конструкции вида contains(.,'some text'), и чем оно отличается от contains(text(),'some text').