硒中的组件对象而不是页面对象
Component objects instead of page objects in selenium
基于 selenium 的测试中最流行的模式之一是页面对象。不幸的是,如果我们按原样使用它,我们经常需要复制代码。考虑以下情况:
- 我们使用UI框架,有共同的组件,说一些花哨的table
- Table比较复杂,有过滤,排序,搜索
- table 在应用程序的多个页面上使用
是否有任何现有的基础设施可以在 selenium 或第三方 lbirary 中创建更细粒度的组件对象而不是页面对象?我的意思是,注释和相关的基础设施?
页面对象有点用词不当。它们不必是特定的整页来遵循页面对象模型。我将创建一个 Table class(页面对象),其中包含 Table 对象的所有定位器和方法,然后将其包含在它出现的 pages/page 对象中。
例如,如果主页包含一个 table 对象,那么 HomePage
class 将引用 Table
class.
Appium 是 selenium webdriver 的移动实现,它有一个小部件的概念,它是页面对象的扩展。有一个 Widget class 允许人们搜索相对于包含在网络浏览器中的元素。您可以在 appium 源代码测试部分查看。查看包 io.appium.java_client.pagefactory_tests.widgets
。这支持 FindBy
注释和 WebElement
构造以及 PageFactory
初始化。
所以不用
@FindBy(.......)
private WebElement myTable;
你可以使用
@FindBy(container of the table....)
private Table myTable;
Table class 现在可以拥有所有相关的变量和方法。
POM.xml的一部分
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>2.53.1</version>
</dependency>
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>4.1.2</version>
</dependency>
测试Class--
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
public class WidgetBrowTest {
@Test
public void test() {
System.setProperty("webdriver.chrome.driver", "E:/Software Testing/Selenium/Jars/chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://whosebug.com/");
SOHome soHome = new SOHome(driver);
PageFactory.initElements(new AppiumFieldDecorator(driver), soHome);
//Below two are from widget - First question in Whosebug homepage
System.out.println(soHome.getFirstQues().getQuesTitle());
System.out.println(soHome.getFirstQues().getQuesTags());
//Below two are from home page
System.out.println(soHome.getLogoText());
System.out.println(soHome.getMenuText());
}
}
Whosebug 主页 -
import java.util.List;
import java.util.stream.Collectors;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
public class SOHome {
@FindBy(css="div[id='hlogo'] > a")
private WebElement logo;
@FindBy(xpath="//div[@id='hmenus']//li/a")
private List<WebElement> menuOpt;
@FindBy(css="div[class='summary']")
private SOQuesWidget firstQues;
private WebDriver driver;
public SOHome(WebDriver driver) {
this.driver = driver;
}
public String getLogoText() {
return logo.getText();
}
public List<String> getMenuText() {
return menuOpt.stream().map(t -> t.getText()).collect(Collectors.toList());
}
public SOQuesWidget getFirstQues() {
return firstQues;
}
}
问题小部件 - 第一个问题
import java.util.List;
import java.util.stream.Collectors;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import io.appium.java_client.pagefactory.Widget;
public class SOQuesWidget extends Widget {
@FindBy(css="a[class='question-hyperlink']")
private WebElement quesTitle;
@FindBy(xpath=".//div[starts-with(@class,'tags')]/a")
private List<WebElement> quesTags;
protected SOQuesWidget(WebElement element) {
super(element);
}
public String getQuesTitle() {
return quesTitle.getText();
}
public List<String> getQuesTags() {
return quesTags.stream().map(t -> t.getText()).collect(Collectors.toList());
}
}
基于 selenium 的测试中最流行的模式之一是页面对象。不幸的是,如果我们按原样使用它,我们经常需要复制代码。考虑以下情况:
- 我们使用UI框架,有共同的组件,说一些花哨的table
- Table比较复杂,有过滤,排序,搜索
- table 在应用程序的多个页面上使用
是否有任何现有的基础设施可以在 selenium 或第三方 lbirary 中创建更细粒度的组件对象而不是页面对象?我的意思是,注释和相关的基础设施?
页面对象有点用词不当。它们不必是特定的整页来遵循页面对象模型。我将创建一个 Table class(页面对象),其中包含 Table 对象的所有定位器和方法,然后将其包含在它出现的 pages/page 对象中。
例如,如果主页包含一个 table 对象,那么 HomePage
class 将引用 Table
class.
Appium 是 selenium webdriver 的移动实现,它有一个小部件的概念,它是页面对象的扩展。有一个 Widget class 允许人们搜索相对于包含在网络浏览器中的元素。您可以在 appium 源代码测试部分查看。查看包 io.appium.java_client.pagefactory_tests.widgets
。这支持 FindBy
注释和 WebElement
构造以及 PageFactory
初始化。
所以不用
@FindBy(.......)
private WebElement myTable;
你可以使用
@FindBy(container of the table....)
private Table myTable;
Table class 现在可以拥有所有相关的变量和方法。
POM.xml的一部分
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>2.53.1</version>
</dependency>
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>4.1.2</version>
</dependency>
测试Class--
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
public class WidgetBrowTest {
@Test
public void test() {
System.setProperty("webdriver.chrome.driver", "E:/Software Testing/Selenium/Jars/chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://whosebug.com/");
SOHome soHome = new SOHome(driver);
PageFactory.initElements(new AppiumFieldDecorator(driver), soHome);
//Below two are from widget - First question in Whosebug homepage
System.out.println(soHome.getFirstQues().getQuesTitle());
System.out.println(soHome.getFirstQues().getQuesTags());
//Below two are from home page
System.out.println(soHome.getLogoText());
System.out.println(soHome.getMenuText());
}
}
Whosebug 主页 -
import java.util.List;
import java.util.stream.Collectors;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
public class SOHome {
@FindBy(css="div[id='hlogo'] > a")
private WebElement logo;
@FindBy(xpath="//div[@id='hmenus']//li/a")
private List<WebElement> menuOpt;
@FindBy(css="div[class='summary']")
private SOQuesWidget firstQues;
private WebDriver driver;
public SOHome(WebDriver driver) {
this.driver = driver;
}
public String getLogoText() {
return logo.getText();
}
public List<String> getMenuText() {
return menuOpt.stream().map(t -> t.getText()).collect(Collectors.toList());
}
public SOQuesWidget getFirstQues() {
return firstQues;
}
}
问题小部件 - 第一个问题
import java.util.List;
import java.util.stream.Collectors;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import io.appium.java_client.pagefactory.Widget;
public class SOQuesWidget extends Widget {
@FindBy(css="a[class='question-hyperlink']")
private WebElement quesTitle;
@FindBy(xpath=".//div[starts-with(@class,'tags')]/a")
private List<WebElement> quesTags;
protected SOQuesWidget(WebElement element) {
super(element);
}
public String getQuesTitle() {
return quesTitle.getText();
}
public List<String> getQuesTags() {
return quesTags.stream().map(t -> t.getText()).collect(Collectors.toList());
}
}