在运行时将值传递给xpath

时间:2018-03-14 18:37:47

标签: selenium xpath selenium-webdriver page-factory

请在不喜欢或评论之前阅读整个Q.我在网上搜索之前已在互联网上搜索过。我有以下项目结构。

pages(package)
    > Homepage.java
test(package)
    > Flipkart.java 

Homepage.java 内部,我已使用 POM Page Factory方法声明了所有WebElements,并创建了相应的方法来点击Electronics链接。 < / p>

@FindBy(xpath = '//input[@title='Electronics']')
private WebElement lnkElectronics;

Fipkart.java 内部我正在调用电子邮件点击方法

我对这里的疑问是声明的WebElement专门用于电子产品。

有没有办法可以创建一个类型如下所述的WebElement,并从main方法动态传递%s的值?

@FindBy(xpath = '//input[@title='%s']')
private WebElement lnkElectronics;

3 个答案:

答案 0 :(得分:2)

Page Object Model in Selenium

引用的答案

您不能使用Variable创建FindBy,FindBy只接受常量。

如果你想要实现这种可变性,那么你应该使用普通的findElement方法编写或找到元素

答案 1 :(得分:1)

根据Page Object Design Pattern后面的测试设计注意事项

  • Page Object 是一个面向对象的类,用作正在测试的应用程序页面的接口。只要需要与该页面的用户界面进行交互,您的@Tests就会使用此 Page Object 类的方法。好处是,如果页面的UI发生变化,则@Tests本身不需要更改。只需更改 Page Object 中的代码。

    优点:

    • 清除测试代码与页面特定代码(如定位器,方法和布局)之间的分离。
    • 页面提供的操作的单一存储库,而不是在整个测试过程中分散这些服务。

根据这些 Page Factory 功能,您无法创建任何可以动态传递值的通用 WebElement 来自main()@Test注释方法,例如

@FindBy(xpath = '//input[@title='%s']')
private WebElement lnkElectronics;

您可以在Where should I define modal specific code in Selenium Page Object Model pattern

中找到几乎类似的讨论

答案 2 :(得分:0)

WorkAround:您可以在页面类上定义一个方法,并可以从调用类中动态传递文本以单击特定选项卡

如果要单击页面上的任何常用文本。您可以创建如下所示的方法,并且可以动态传递文本以单击该页面上的特定标签。

  public void clickTab(String tabText){
       String tabxpath = "//div[contains(text(), '" + tabText + "')]";
       driver.findElement(By.xpath(tabxpath)).click();

   }