我正在寻找解决方案如何在页面对象模型中为selenium webdriver获取相对于另一个对象的页面对象
我的测试代码:
class StartPage {
WebDriver driver;
public HomePage(driver) {
this.driver = driver;
}
@FindBy(xpath="//div[@class='widget']//a[text()='link text']")
WebElement linkInWidget;
public void clickLink() {
linkInWidget.click();
return PageFactory.initElements(driver, NextPage.class);
}
}
下一页
class NextPage {
WebDriver driver;
public HomePage(driver) {
this.driver = driver;
}
@FindBy(xpath="//div[@class='widget']//input[@type='button']")
WebElement buttonInWidget;
@FindBy(id = "Index")
WebElement index;
public void clickButton() {
buttonInWidget.click();
return PageFactory.initElements(driver, NextPage.class);
}
public String getText() {
return index.getText();
}
}
配置类
public class ConfigureTest{
protected WebDriver driver;
protected String baseUrl;
protected StartPage startPage;
protected NextPage nextPage ;
@BeforeSuite
public void setUp() {
baseUrl = "http://webapp.com/";
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@AfterSuite
public void tearDown() throws Exception {
driver.quit();
}
}
我的测试课程
public class SomeTest extends ConfigureTest {
@Test
public void testLinkAndButton() throws Exception {
startPage = PageFactory.initElements(driver, SomePage.class);
driver.get(baseUrl);
nextPage = startPage.clickLink();
nextPage.clickButton();
String data = nextPage.getText();
}
}
在FirstPage和NextPage这两个类中,我通过xpath找到具有相同第一部分 // div [@class =' widget'] 的元素,这意味着所有元素如按钮和链接在这个小部件下,我的所有页面中的小部件都有相同的xpath
问题:如果我的小部件的xpath只会被更改,我必须在我的测试的所有页面对象中进行更改
问题:以任何方式改进我的测试以获得更多灵活性,例如:
page().get(Widget.class, "Widget name").get(Button.class, "Button name").click
更新:我以这种方式解决了部分问题: 我使用get方法创建我的UI元素的类,这些方法可以返回任何类的对象:
Widget对象类
public class widget{
WebDriver driver;
public widget (WebDriver driver) {
this.driver = driver;
}
// Find a single element
@FindBy(xpath="//div[@class='tsf-p']")
WebElement linkInWidget;
public void click() {
linkInWidget.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");
但如何通过名称或数字获取元素,例如:
homePage.get(widget.class, "Name").get(Input.class, 1).setValue("yahoo");
答案 0 :(得分:2)
我有一个公共存储库here,我在其中使用PageFactory
实现了PageObject和TestNG
概念。您可能正在寻找更好的方法来继承BaseClasse。常用方法应放在BaseClass中,并通过继承可用于所有PageObjects。我把所有东西放在GitHub中,而且它太宽泛了,无法在这里实现。