Как заставить webdriver переключаться между использованием css, xpath, tag, link или id элемента - PullRequest
0 голосов
/ 27 апреля 2018

В настоящее время все мои определения шагов принимают только идентификаторы элементов для выполнения действий на веб-странице.

driver.findElement(By.id("id"));

Но что, если я захочу передать селектор css, тег, ссылку или xpath? Я не хочу переписывать все мои определения шагов для всех этих сценариев (или создавать несколько одинаковых шагов), не зная, какой из них будет пройден.

driver.findElement(By.cssSelector("css"));
driver.findElement(By.link("link"));
driver.findElement(By.tagName("tag"));
driver.findElement(By.xpath("xpath"));

Могу ли я использовать оператор switch, который определит, какой тип локатора ему передается, и затем продолжит выполнять соответствующее действие?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Вы можете создать вспомогательный класс для возврата By в соответствии с другой строкой локатора.

// feature file
Secnario Outline: Test user login
  Given ...
  And user input username: <value> into <element>
  And user input password: <value> into <element>

  Examples:
    | value | element |
    | user1 | id:username |
    | pwd1  | css:input.pwd |

// helper class to build Locator
public class Locator {

  public static By build(locator) {
    String[] parts = locator.split(":");
    String use = parts[0].trim().lowerCase();
    String value = parts[1].trim();

    if(use.equals("id")) {
      return By.id(value);
    }
    else if(use.equals("css")){
      return By.css(value);
    }
    .....
  }
}

// step definition
Then("^user input username: (.+) into (.+)$", 
      (String inputValue, String locatoExp) -> {

    driver.findElement(Locator.build(locatoExp)).sendKeys(inputValue);
});
0 голосов
/ 28 апреля 2018

Вы пытаетесь передать идентификаторы элементов из файлов объектов через определения шагов, аналогичные примеру, который опубликовал пользователь 'yong'?

Если это так, то я настоятельно рекомендую пересмотреть этот подход. Вся цель использования Gherkin в качестве слоя поверх обычного кода состоит в том, чтобы сделать тесты удобочитаемыми для людей, которые не знают о технической реализации.

Я бы предпочел использовать одно определение шага для каждого поля ввода, поэтому, если вам нужно получить доступ к этому полю в нескольких тестах, вам не нужно каждый раз указывать ID или cssSelector. Если бы ID полей в HTML изменились, вам не нужно обновлять файлы объектов, а только определение шага.

Если часто случается, что вы используете одни и те же элементы в многоэтапных определениях, взгляните на шаблон объектной модели страницы, где вы определяете элементы только один раз на страницу, чтобы вы могли повторно использовать их в многоэтапных определениях.

0 голосов
/ 28 апреля 2018

Не знаю, правильно ли я вас понимаю, но каждый из статических методов в классе By возвращает объект By. Поэтому, если вы хотите создать метод, который работает с идентификатором, селектором CSS, XPath ... вы можете просто использовать By в качестве типа параметра.

Так что вместо передачи идентификатора как String вот так ...

public void foo(String id) {
    // ...
    driver.findElement(By.id(id));
    // ...
}

… вы можете сделать…

public void foo(By by) {
    // ...
    driver.findElement(by);
    // ...
}

… и, таким образом, абонент foo может передать любой By, который ему нравится.

...