Intereting Posts

Поиск элемента с помощью частичного id с Selenium в C #

Я пытаюсь найти элемент с динамически сгенерированным идентификатором. Последняя часть строки является постоянной («ReportViewer_fixedTable»), поэтому я могу использовать ее для поиска элемента. Я попытался использовать регулярное выражение в XPath:

targetElement = driver.FindElement( By.XPath("//table[regx:match(@id, "ReportViewer_fixedTable")]")); 

И поиск по CssSelector:

 targetElement = driver.FindElement( By.CssSelector("table[id$='ReportViewer_fixedTable']")); 

Ничего не работает. Мы ценим любые предложения.

Это потому, что селектор css нужно изменить, вы были почти там …

 driver.FindElement(By.CssSelector("table[id*='ReportViewer_fixedTable']"))` 

Из https://saucelabs.com/blog/selenium-tips-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). *= надежно в любой ситуации.

попробуйте использовать

 targetElement = driver.FindElement(By.XPath("//table[contains(@id, "ReportViewer_fixedTable")]")); 

Обратите внимание, что это проверит все элементы с идентификатором, который содержит (и не только заканчивается «ReportViewer_fixedTable»). Я попытаюсь найти вариант регулярного выражения, который будет более точным ответом на ваш вопрос.

Это решение будет работать независимо от версии XPath. Во-первых, создайте метод где-нибудь в своём classе 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("")) 

Для идентификаторов управления, которые я упомянул для v1 и v2, я использую, как показано ниже:

 By.XPath(Common.GetXpathStringForIdEndsWith("hylHomeLoginCreateUser")) 

Общая логика заключается в том, что вы можете использовать приведенное ниже выражение XPath, чтобы найти элемент управления, который заканчивается определенной строкой:

 //*[substring(@id, string-length(@id)- string-length("") + 1 )=""]