Необходимо передать параметр для нескольких ссылок для проверки в огурце.

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

Домашняя страница.функция

  Scenario: To Test Home Tab
      Given I am on Homepage
      When I Click on ".//*[@id='oneHeader']/div[3]/div/div[2]/nav/ul/li[1]/a/span"
      Then I am on "Home"
      And application should be closed

  Scenario: To Test Calender Tab
    Given I am on Homepage
    When I Click on "Calender"
    Then I am on "Calender"
    And application should be closed

  Scenario: To Test Lead Tab
    Given I am on Homepage
    When I Click on "Leads"
    Then I am on "Leads"
    And application should be closed

  Scenario: To Test Oppurtunities Tab
    Given I am on Homepage
    When I Click on "Oppurtunities"
    Then I am on "Oppurtunities"
    And application should be closed

  Scenario: To Test Accounts Tab
    Given I am on Homepage
    When I Click on "Accounts"
    Then I am on "Accounts"
    And application should be closed


  Scenario: To Test Contacts Tab
    Given I am on Homepage
    When I Click on "Contacts"
    Then I am on "Contacts"
    And application should be closed

  Scenario: To Test Dashboard Tab
    Given I am on Homepage
    When I Click on "Dashboards"
    Then I am on "Dashboards"
    And application should be closed

  Scenario: To Test Reports Tab
    Given I am on Homepage
    When I Click on "Reports"
    Then I am on "Reports"
    And application should be closed

Определение шага выглядит так

package stepDefination;

import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class SmokeTest {
    WebDriver driver;

    public SmokeTest() {
    }

    @Given("^Open firefox and start application$")
    public void Open_chrome_and_start_application() throws Throwable {
        this.driver = new FirefoxDriver();
        this.driver.manage().window().maximize();
        this.driver.get("http://test.salesforce.com/");
    }

    @When("^I enter valid \"([^\"]*)\" and valid \"([^\"]*)\"$")
    public void I_enter_valid_and_valid(String unam, String pass) throws Throwable {
        this.driver.findElement(By.xpath(".//*[@id=\'username\']")).sendKeys(new CharSequence[]{unam});
        this.driver.findElement(By.xpath(".//*[@id=\'password\']")).sendKeys(new CharSequence[]{pass});
    }

    @Then("^I should be able to login successfully$")
    public void user_should_be_able_to_login_successfully() throws Throwable {
        this.driver.findElement(By.id("Login")).click();
    }

    @Given("^I am on Homepage$")
    public void i_am_on_Homepage() throws Throwable {
        this.driver.findElement(By.xpath(".//*[@id=\'salesforceLogo\']"));
    }

    @When("^I Click on \"([^\"]*)\"$")
    public void i_Click_on(String Link) throws Throwable {
        this.driver.findElement(By.id(Link)).click();
    }

    @Then("^I am on \"([^\"]*)\"$")
    public void i_am_on(String Tab) throws Throwable {
        this.driver.findElement(By.id(Tab));
    }

    @Then("^application should be closed$")
    public void application_should_be_closed() throws Throwable {
        this.driver.quit();
    }
}

person Madhumita    schedule 26.10.2016    source источник


Ответы (2)


Здесь вы просто тестируете навигацию с главной страницы. Это довольно недорогой тест, он требует довольно много работы, и вы не получите от него многого. Тем не менее, иногда я пишу такие сценарии. Вот как бы я это сделал.

Feature: Navigation from home page
  As a user 
  I want to be able to get to important places from the home page
  So I can use the home page as a starting point

Background: 
  Given I am on the homepage

Scenario: Navigate to contacts
  When I navigate to contacts
  Then I should see my contacts

Я бы сделал сценарий для каждой части навигации, потому что

  1. Это намного яснее
  2. Сокращение количества определений шагов относительно неважно.

Я бы реализовал определения шагов следующим образом (обратите внимание, что это на ruby, вам придется перевести на java.

# features/step_definitions/homepage/navigation_steps.rb

When 'I navigate to contacts' do
  click_link '.nav-to-contacts'
end

Снова я сделаю определение шага для каждой вещи, потому что это намного проще. Обратите внимание, как я использую css для щелчка, это означает, что если кто-то придет и изменит текст, скажем, «Мои контакты», нам не нужно обновлять наш сценарий.

Наконец, я сделаю то же самое для «тогда»

Then 'I should see my contacts' do
  expect(page).to have_css('.contacts')
end

Некоторые моменты:

  • вам не нужно закрывать приложение в каждом сценарии. Это утомительно и ненужно. Огурец сделает это за вас.
  • использование регулярных выражений в сценариях часто приводит к обратным результатам. Гораздо важнее, чтобы сценарий был простым и ясным, чем кратким. Это особенно применимо, когда сценарий терпит неудачу.
  • включение того, «как» делается в сценарии, — плохая идея. Это делает вещи намного более дорогими, чтобы изменить. Этот тест по-прежнему будет выполнять свою работу, когда появится какой-нибудь дизайнер и изменит ваши вкладки на какой-то другой элемент управления пользовательского интерфейса. Как вещи в вашем сценарии включают в себя: URL-адреса и клики
  • у вас есть целая файловая система для хранения ваших функций и сценариев. Используйте его с умом, чтобы организовать как функции, так и определения шагов. Расположение сценария/шага_определения должно многое рассказать вам о его функции.

Наконец, схемы сценариев — одна из самых переоцененных частей Cucumber, я бы настоятельно рекомендовал их избегать. Они сокращают код там, где он наименее важен, добавляют сложности и их гораздо труднее реализовать. Когда один выходит из строя, требуется гораздо больше времени, чтобы диагностировать проблему. Действительно, лучше иметь 5 простых сценариев, чем один сложный.

person diabolist    schedule 27.10.2016

Код Map, у которого есть ключ как имя ссылки и значение как xpath к ссылке. Используйте ключ в файле функций и получите доступ к xpath в определении шага.

    private static Map<String, String> links = new HashMap<>();
    links.put("Home","//*[@id='oneHeader']/div[3]/div/div[2]/nav/ul/li[1]/a/span");
    ....
    ....

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

public class LocatorObject {

     private By by;
     private String locator;

     public LocatorObject(By by, String loc) { // usual stuff }
}

links.put("Home", new LocatorObject (By.xpath, "//*[@id='oneHeader']/div[3]/div/div[2]/nav/ul/li[1]/a/span"));

Посмотрите ScenarioOutline вместо того, чтобы писать несколько похожих сценариев.

Scenario Outline:
    Given I am on Homepage
    When I Click on <Link>
    Then I am on <Validate>
    And application should be closed

    Examples:
    | Link | Validate |
    | Home | Home |
    | Calender | Calender |
    | Leads | Leads |
    etc etc
person Grasshopper    schedule 27.10.2016