Selenium 在运行时将值传递给xpath

Selenium 在运行时将值传递给xpath,selenium,xpath,selenium-webdriver,page-factory,Selenium,Xpath,Selenium Webdriver,Page Factory,在不喜欢或评论某件事之前,请阅读整个Q。在发布到这里之前,我已经在互联网上搜索过了。我的项目结构如下 pages(package) > Homepage.java test(package) > Flipkart.java 在主页内.java我已使用POM页面工厂方法声明了所有WebElement,并创建了相应的方法来单击电子链接。 @FindBy(xpath = '//input[@title='Electronics']') private WebElemen

在不喜欢或评论某件事之前,请阅读整个Q。在发布到这里之前,我已经在互联网上搜索过了。我的项目结构如下

pages(package)
    > Homepage.java
test(package)
    > Flipkart.java 
主页内.java我已使用POM页面工厂方法声明了所有WebElement,并创建了相应的方法来单击电子链接。

@FindBy(xpath = '//input[@title='Electronics']')
private WebElement lnkElectronics;
Fipkart.java内部我正在调用电子点击方法

我的疑问是,声明的WebElement是专门用于电子产品的

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

@FindBy(xpath = '//input[@title='%s']')
private WebElement lnkElectronics;
根据以下试验设计考虑:

  • 页面对象是一个面向对象的类,用作被测应用程序页面的接口。您的
    @Tests
    在需要与该页面的用户界面交互时使用此页面对象类的方法。这样做的好处是,如果页面的UI发生了更改,则无需更改
    @测试本身。只有页面对象中的代码需要更改

    优点:

    • 测试代码和页面特定代码(如定位器、方法和布局)之间的清晰分隔
    • 页面提供的操作的单一存储库,而不是将这些服务分散在整个测试中
基于这些页面工厂功能,您将无法创建任何通用WebElement,您可以从
main()
@Test
注释方法动态传递值,例如

@FindBy(xpath = '//input[@title='%s']')
private WebElement lnkElectronics;
您可以在参考的答案中找到几乎类似的讨论

不能使用变量创建FindBy,FindBy只接受常量


如果您想要实现这种可变性,那么您应该使用普通的findElement方法编写或查找元素。解决方法:在page类上,您可以定义一个方法,并可以动态地从调用类传递文本以单击特定选项卡

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

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

   }

如果希望使用FindBy注释,则不需要,因为它需要一个常量值。一种可能的解决方法是,如果可以将WebElement的列表缩小到所需的范围,则创建一个WebElement列表,并在page类中编写一个方法来传递参数并在数组中搜索该特定项。