当前位置: 首页 > 知识库问答 >
问题:

如何在Selenium WebDriver中按相对于另一个页面对象的名称或编号获取页面对象

松英喆
2023-03-14

有没有办法像这样通过名称或数字返回页面对象:

homePage.get(widget.class, "Name").get(Input.class, 1).setValue("yahoo");

我用get方法创建我的UI元素(小部件、输入)的类,它可以返回任何类的对象

小部件的类别

public class widget{
    WebDriver driver;
    By searchResult = By.xpath("//div[@id='ires']//a[contains(text(), '')]");

    public widget (WebDriver driver) {
        this.driver = driver;
    }


    public void click() {
        driver.findElement(searchResult).click();    }

    public <T> T get(Class<T> expectedPage, String uiclass){
        return PageFactory.initElements(driver, expectedPage);
    }


}

按钮对象的类

public class Button {
    WebDriver driver;

    public Button (WebDriver driver) {
        this.driver = driver;
    }

    @FindBy(name="btnG")
    WebElement button;

    public void click() {
        button.click();
    }

    public <T> T get(Class<T> expectedPage){
        return PageFactory.initElements(driver, expectedPage);
    }


}

主页类别

public class HomePage {
    WebDriver driver;

    public HomePage(WebDriver driver) {
        this.driver = driver;
    }

    @FindBy(xpath="//div[@class='widget']//a[text()='']")
    WebElement linkInWidget;

    public void click() {
        linkInWidget.click();
    }

    public <T> T get(Class<T> expectedPage, String name){

        return PageFactory.initElements(driver, expectedPage);
    }

}

我的测试

public class searchTest {
    WebDriver driver;

    @BeforeTest
    public void setup() {
        driver = new FirefoxDriver();
        driver.get("https://www.google.com.ua/");
    }

    @Test
    public void testUI() {
        HomePage homePage = PageFactory.initElements(driver, HomePage.class);
        widget widget = PageFactory.initElements(driver, widget.class);

        homePage.get(widget.class).get(Input.class).setValue("yahoo");
        homePage.get(widget.class).get(Button.class).click();

   }
}

结果是我们可以通过使用我们的类来组合任何对象

homePage.get(widget.class).get(Input.class).setValue("yahoo");

问题:我的xpath是动态的,应该包含名称

"//div[@class='widget']//a[text()='+name+']"

如何使用如下构造返回具有特定名称的新对象:

page().get(Widget.class, "Widget name").get(Button.class, "Button name").click

有什么想法吗?

共有1个答案

万俟亦
2023-03-14
Before you click on new window set the window into a map
after you open the window this window is not in the list so you can get his number
i have some method using java8

//Before click
 public static String initWindows(WebDriver driver) {
    windows = new HashSet<String>();
    driver.getWindowHandles().stream().forEach(n -> windows.add(n));
    return driver.getWindowHandle();
  }

//After the click
  public static String getNewWindow(WebDriver driver) {
    List<String> newWindow = driver.getWindowHandles().stream()
        .filter(n -> windows.contains(n) == false).collect(Collectors.toList());
    System.out.println(newWindow.get(0));
    return newWindow.get(0);
  }
 类似资料:
  • 我正在寻找解决方案,如何在selenium webdriver的页面对象模型中获取相对于另一个对象的页面对象 我的测试代码: 下一页 配置类 我的测试课 在FirstPage和NextPage这两个类中,我都通过xpath找到元素,xpath具有相同的第一部分//div[@class='widget'],这意味着所有元素(如按钮和链接)都在这个小部件下,我在我的所有页面中都有相同的小部件xpath

  • 问题内容: 有什么解决方案来获取对象的函数名称? -没有有关或的信息。有可能得到其中之一吗? 问题答案: 获取对象的构造函数,然后检查其name属性。 返回“ myClass”。

  • 我遵循页面对象模型。假设我有一个扩展BasePage的NewPage类,在该类中我有这样的方法: } 这样可以吗,或者对于clickRed()和clickBlue()方法,将这些方法作为public void是更好的做法吗?像这样:

  • 问题内容: 像这样,A a = new A(),如何获得a的名称?(从a中获得字符串“ a”)? 有一个JPanel包含一些JTextField,一个映射包含所有JTextField的名称(变量的名称)。我想将地图的值设置为JTextFields的文本。 跨过getName()方法,我得到了null -_-我知道getName()方法不用于获取变量名。我正在使用netbeans进行Java swi

  • 本章是一个针对页面对象设计模式的教程引导。 一个页面对象表示在你测试的WEB应用程序的用户界面上的区域。 使用页面对象模式的好处: 创建可复用的代码以便于在多个测试用例间共享 减少重复的代码量 如果用户界面变化,只需要修改一处 6.1. 测试用例 下面是一个在python.org网站搜索一个词并保证一些结果可以找到的测试用例。 import unittest from selenium impor

  • 我有一个关于selenium WebDriver中页面对象的问题。我们的站点非常动态,有很多ajax和各种身份验证状态。如何定义每个页面对象,但让我们假设我已经弄清楚了,并定义了代表我们站点的几个页面对象。 你如何处理从一页到另一页的交叉?因此,我得到一个页面对象用于我的主页,一个用于我的帐户页面,一个用于我的结果页面。然后我需要编写一个遍历我所有页面的测试来模拟一个用户执行多个动作。