Как использовать подстановочные знаки в CssSelector при поиске элемента через Selenium? - PullRequest
0 голосов
/ 09 января 2020

У меня проблема с тем, что используемый мной CssSelector имеет GUID, который меняется каждый раз, и поэтому тесты пройдут только один раз. Есть ли подстановочный знак, который я могу использовать в CssSelector, который поможет мне обойти это? Рассмотрим следующий код ...

IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("# Grid365e0689-dccb-695f-97af-dc29187d4e1d-id-cell-0-7 > a"));
PersonalPhone.Click();

Я бы хотел, чтобы приведенный выше код определял местонахождение элемента через CssSelector с использованием подстановочного знака, чтобы я мог удалить часть GUID селектора и найти элемент только на основе последняя часть 'id-cell-0-7', а затем нажмите на элемент.

Я использую Selenium WebDriver (Chrome), написанный на C#

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 09 января 2020

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

IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("[id^='Grid'][id*='-id-cell-'] > a"));
PersonalPhone.Click();

Оптимизация строки кода в одной строке:

Driver.driver.FindElement(By.CssSelector("[id^='Grid'][id*='-id-cell-'] > a")).Click();

Пояснение

Атрибут id:

  • Всегда начинать с Grid, за которым следует значение Dynami c, так что вы можете использовать ^, чтобы указать, начинается с
  • Всегда содержать -id-cell- на заднем конце, поэтому вы можете использовать * для обозначения содержит

Однако, поскольку желаемый элемент является динамическим c элементом поэтому для вызова click() на элементе вам может потребоваться WebDriverWait для ElementToBeClickable(), и вы можете использовать любую из следующих стратегий локатора :

  • CssSelector:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("[id^='Grid'][id*='-id-cell-'] > a"))).Click();
    
  • XPath:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//*[starts-with(@id, 'Grid') and contains(@id, '-id-cell-')]/a"))).Click();
    
0 голосов
/ 09 января 2020

Извините, что сообщаю вам эту новость, но xpath 1.0 все еще используется в большинстве драйверов ... вполне:

Как отмечали другие ответы, XPath 1.0 не поддерживает регулярные выражения.

Рекомендуется использовать родительские элементы, чтобы найти элемент, по которому вы кликаете sh.

или .. если ключевое слово grid-xxx--xxx-- постоянно, вы можете сделать что-то как

Xpath: //*[starts-with(@id, 'Grid')]/a - идентификатор начинается с сетки

CSS: input[id^='Grid'] > a - идентификатор начинается с сетки

Изменить вход к фактическому веб-элементу.

0 голосов
/ 09 января 2020

Вы можете использовать частичное id с содержанием *=

IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("[id*='id-cell-0-7'] > a"));

или оканчиваться на $=

IWebElement PersonalPhone = Driver.driver.FindElement(By.CssSelector("[id$='id-cell-0-7'] > a"));
...