Поиск элемента с помощью частичного 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>"]