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

时间:2015-03-30 11:07:36

标签: selenium-webdriver

如何按名称或数字返回页面对象是这样的:

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

我使用get方法创建我的UI元素类(widget,Input),这些方法可以返回任何类的对象

小工具类

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);
    }


}

Button对象类

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 个答案:

答案 0 :(得分:0)

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);
  }