基本上,我想断言(来自我的测试类)WebElement包含text()。由于我的所有WebElements都是在我的page.class中定义的,因此我认为我必须将它们公之于众。
我遇到了一些webdriver和元素的问题,我想这可能是因为多个测试类同时从页面类访问WebElements。我的问题是:WebElements必须是私有的吗?
代码示例:
我见过的所有PageFactory教程都说要将你的WebElements设为私有,比如
@FindBy(xpath = "//*[@id='searchStringMain']")
private WebElement searchField;
但是为了断言一个元素包含文本(来自另一个类),我必须像这样定义它们:
@FindBy(xpath = "(//*[contains (text(),'Hrs')])[2]")
public static WebElement yourLoggedTime;
答案 0 :(得分:1)
考虑这个例子:
package org.openqa.selenium.example;
import org.openqa.selenium.By;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.WebElement;
public class GoogleSearchPage {
// The element is now looked up using the name attribute
@FindBy(how = How.NAME, using = "q")
private WebElement searchBox;
public void searchFor(String text) {
// We continue using the element just as before
searchBox.sendKeys(text);
searchBox.submit();
}
}
搜索框是私有的,但方法searchFor是公开的。测试将使用searchFor但从不使用searchBox。
我通常把页面工厂的initElements调用放在页面构造函数的最后一行。这使得所有公共函数都可用于测试。所以
package org.openqa.selenium.example;
import org.openqa.selenium.By;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;
import org.openqa.selenium.WebElement;
public class GoogleSearchPage {
public WebDriver driver;
// The element is now looked up using the name attribute
@FindBy(how = How.NAME, using = "q")
private WebElement searchBox;
public GoogleSearchPage(WebDriver driver) {
this.driver = driver
PageFactory.initElements(driver, this);
}
public void searchFor(String text) {
// We continue using the element just as before
searchBox.sendKeys(text);
searchBox.submit();
}
}
在您的测试中,您可以执行以下操作:
new GoogleSearchPage(webDriver).searchFor("Foo");
答案 1 :(得分:0)
您可以将您的课程公开,但作为标准惯例,建议您使用getter方法提交课程而非直接存档。
问题是您使用公开的static
关键字。当您使用带有(webelement)的@FindBy
注释时,它会在类初始化时初始化(或者根据您调用initElements()
时的实现)进行初始化。因此,webelement
public
但static
没有问题。例如:
在您的网页课程中:
@FindBy(xpath = "(//*[contains (text(),'Hrs')])[2]")
public WebElement yourLoggedTime;
在测试中:
String yourLoggedTime = pageObj.yourLoggedTime.getText(); //pageObj is object of your page class