selenium - selenium 中的组件对象而不是页面对象

标签 selenium selenium-webdriver pageobjects

基于 selenium 的测试中最流行的模式之一是页面对象。不幸的是,如果按原样使用,我们经常需要复制代码。考虑以下情况:

  • 我们使用 UI 框架,带有通用组件,比如一些花哨的表格
  • 表格相当复杂,有过滤、排序、搜索
  • 该表格用于应用程序中的多个页面

  • 是否有任何现有的基础架构可以在 selenium 或第三方图书馆中创建更细粒度的组件对象而不是页面对象?我的意思是,注释和相关的基础设施?

    最佳答案

    Appium 是 selenium webdriver 的移动实现,它有一个小部件的概念,它是 pageobjects 的扩展。有一个 Widget 类,它允许人们相对于包含在 Web 浏览器中的元素进行搜索。您可以在 appium 源代码测试部分查看这一点。看看包装io.appium.java_client.pagefactory_tests.widgets .这支持FindBy注释和 WebElement构造和 PageFactory初始化。

    所以而不是使用

    @FindBy(.......)
    private WebElement myTable;
    

    您可以使用
    @FindBy(container of the table....)
    private Table myTable;
    

    表类现在可以拥有所有相关的变量和方法。

    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>
    

    测试类——
    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://stackoverflow.com/");
    
    
            SOHome soHome = new SOHome(driver);
            PageFactory.initElements(new AppiumFieldDecorator(driver), soHome);
    
            //Below two are from widget - First question in stackoverflow 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());
        }
    }
    

    StackOverflow 主页 -
    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 - selenium 中的组件对象而不是页面对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40536349/

    相关文章:

    python - PhantomJS webdriver 的创建导致 Python 中通过 ssh session 的用户输入问题

    java - 如何从 Selenium WebDriver 的下拉列表中获取所有元素?

    java - Cucumber-jvm 和页面对象的泛型不起作用

    c# - 缺少[程序集 :RuntimePlugin] attribute in SpecFlowPlugin

    javascript - 如何使mocha中的 "it"等到 "it"内的 promise 得到解决?

    java - 以编程方式设置 Selenium 代理

    java - 如何使用selenium处理 session 超时

    selenium - 用于测试 UC 浏览器的正确 WebDriver 是什么

    java - @FindBy WebElements 未在 PageFactory/页面对象框架中初始化

    javascript - 如何使用 Cucumber\Ruby\PageObject 从浏览器 JavaScript 全局变量中获取值?