Поиск элемента с помощью частичного id с Selenium в С#
Я пытаюсь найти элемент с динамически сгенерированным идентификатором. Последняя часть строки является постоянной ( "ReportViewer_fixedTable" ), поэтому я могу использовать ее для поиска элемента. Я попытался использовать регулярное выражение в XPath:
targetElement = driver.FindElement(
By.XPath("//table[regx:match(@id, "ReportViewer_fixedTable")]"));
И поиск по CssSelector:
targetElement = driver.FindElement(
By.CssSelector("table[id$='ReportViewer_fixedTable']"));
Ничего не работает. Любые предложения будут оценены.
Ответы
Ответ 1
Это потому, что селектор css нужно изменить, вы были почти там...
driver.FindElement(By.CssSelector("table[id*='ReportViewer_fixedTable']"))`
Из http://sauceio.com/index.php/2010/01/selenium-totw-css-selectors-in-selenium-demystified/:
css=a[id^='id_prefix_']
Ссылка с id
, которая начинается с текста id_prefix_
.
css=a[id$='_id_sufix']
Ссылка с id
, которая заканчивается текстом _id_sufix
.
css=a[id*='id_pattern']
Ссылка с id
, содержащая текст id_pattern
.
Вы использовали суффикс, который, как я предполагаю, не был частью текстового идентификатора частичной ссылки, который вы должны использовать (если только я не видел ваш html, а это означает, что в следующий раз попробуйте показать ваш html). *=
является надежным в любой ситуации.
Ответ 2
попробуйте использовать
targetElement = driver.FindElement(By.XPath("//table[contains(@id, "ReportViewer_fixedTable")]"));
Обратите внимание, что это проверит все элементы с идентификатором, который содержит (и не только заканчивается на "ReportViewer_fixedTable" ). Я попытаюсь найти вариант регулярного выражения, который будет более точным ответом на ваш вопрос.
Ответ 3
Это решение будет работать независимо от версии XPath. Во-первых, создайте метод где-нибудь в своём классе COMMON.
public static string GetXpathStringForIdEndsWith(string endStringOfControlId)
{
return "//*[substring(@id, string-length(@id)- string-length(\"" + endStringOfControlId + "\") + 1 )=\"" + endStringOfControlId + "\"]";
}
В моем случае ниже приведен идентификатор элемента управления в другой версии моего продукта::
v1.0:: ContentPlaceHolderDefault_MasterPlaceholder_HomeLoggedOut_7_hylHomeLoginCreateUser
v2.0:: ContentPlaceHolderDefault_MasterPlaceholder_HomeLoggedOut_8_hylHomeLoginCreateUser
Затем вы можете вызвать описанный выше метод, чтобы найти элемент управления, который имеет статическую конечную строку.
By.XPath(Common.GetXpathStringForIdEndsWith("<End String of the Control Id>"))
Для идентификатора элемента управления, который я упомянул для v1 и v2, я использую, как показано ниже:
By.XPath(Common.GetXpathStringForIdEndsWith("hylHomeLoginCreateUser"))
Общая логика заключается в том, что вы можете использовать приведенное ниже выражение XPath для поиска элемента управления, который заканчивается определенной строкой:
//*[substring(@id, string-length(@id)- string-length("<EndString>") + 1 )="<EndString>"]