如何动态使用Selenium的@FindBy?

时间:2017-07-14 06:58:31

标签: java selenium webdriver cucumber

我要在this page以上用黄瓜运行硒。这是黄瓜情景和大纲

@tag
Feature: Check the checkbox
  Webdriver should be able to check the checkbox lists

  @tag1
  Scenario: Check the checkbox
    Given I am in checkbox task page 
    When I can check the hobbies from the checkbox
    And I click on "Next Task"
    Then It navigates to the next task

  @tag2
  Scenario Outline: Title of your scenario outline
    Given I am in "http://suvian.in/selenium/1.6checkbox.html"
    When I can check the <id> from the checkbox
    And I click on "Next Task"
    Then It navigates to the "http://suvian.in/selenium/1.7button.html"

    Examples: 
       | id |
       |  1 |
       |  2 |
       |  3 |
       |  4 |

然后在POM(页面对象模型)中,复选框的id为checkId。我有以下内容:

public class CheckBoxPage {

    @FindBy(how=How.ID, using="????")
    public WebElement checkId;
}

我不知道如何设置using部分。问题是Id1 to 4不同。

3 个答案:

答案 0 :(得分:0)

无法做到。 @FindBy注释期望using为String常量,无法动态设置。

为什么不在CheckBoxPage中定义所有四个复选框?这并不是说页面上的复选框数量会发生变化。

public class CheckBoxPage {

    @FindBy(how= How.ID, using="1")
    private WebElement singingCheckbox;

    @FindBy(how= How.ID, using="2")
    private WebElement dancingCheckbox;

    @FindBy(how= How.ID, using="3")
    private WebElement sportsCheckbox;

    @FindBy(how= How.ID, using="4")
    private WebElement gamingCheckbox;
}

答案 1 :(得分:0)

您无法使用PageFactory为标识符设置dyanic值,因为它需要constant String作为值

但是,如果你真的必须实现这一点,你可以在步骤中创建元素并单击它,如下所述。

Feature: Check the checkbox
  Scenario Outline: Click all Check Boxes
  Given I am in "http://suvian.in/selenium/1.6checkbox.html"
  Then It should click <id> checkbox
    Examples:
    | id |
    |  1 |
    |  2 |
    |  3 |
    |  4 |

步骤定义

   @Given("^I am in \"([^\"]*)\"$")
    public void i_am_in(String arg1) throws Throwable {
        driver.get(arg1);
    }
    @Then("^It should click (\\d+) checkbox$")
    public void it_should_click_checkbox(int arg1) throws Throwable {
        driver.findElement(By.id(Integer.toString(arg1))).click();
    }

答案 2 :(得分:-2)

这些步骤将添加到定义类中,您将在那里引用ID。由于您将四个值指定为ID,因此@tag2方案将运行四次,并且每次运行时都会相应地采用ID的值。即,在第一次运行时,ID中的值将为1,其中ID值将为2,依此类推。