使用Ruby和Selenium查找所有Web元素

时间:2014-04-14 12:11:09

标签: ruby-on-rails ruby selenium webdriver elements

我是Ruby和Selenium Webdriver noob ......

我不是一次抓取一个元素并将其放入变量中,而是希望一次抓取所有的网页元素,包括按钮,字段等。

我试过从网上抓取find_elements的例子,但它没有用,所以我做错了。

那么我需要做些什么才能获取网页的所有元素,然后如何使用特定的元素呢?

谢谢, 斯科特

1 个答案:

答案 0 :(得分:0)

原谅我对拥有字段装饰器的Ruby的无知或某种方式在Java中使用PageFactory。有几篇关于使用Page Object Model和PageFactory的great articles和博客文章。它可能不是你正在寻找的东西,但也许Ruby有类似的东西。

PageFactory的要点基本上是,为您的页面创建一个类,并为具有id或name属性的元素添加WebElement字段。对变量名使用相同的id / name值。您还可以使用字段装饰器来传递FindBy。然后在构造函数中调用PageFactory.init(factory,object),PageFactory将查找元素或元素列表。

让我们看看我是否可以提供一个QAD示例,您可以获得该想法,然后使用POM进行研究。

public abstract class PageBase implements WrapsDriver{

    protected String URL;
    protected String title;
    protected WebDriver driver;
    protected ElementLocatorFactory factory;



    public PageBase(WebDriver driver, String pageTitle){
        this.driver = driver;
        this.title = pageTitle;
        this.factory = new AjaxElementLocatorFactory(driver, 2);
    }

    abstract void open();
...

}

public class SomePage extends PageBase{
/*
*<div id="thin_client_viewer" style="position: relative">
*/
    public WebElement thin_client_viewer; 
    public WebElement primaryContentLink; //<a id="primaryContentLink" style="display:none" href=""></a>
    public WebElement loadingSpinner; //hidden <div id="loadingSpinner" style="display: none;">
    public WebElement top_toolbar; 
    .
    .
    .

您也可以声明列表并使用自定义装饰器:

   .
    .
    .

    /*
     * <div id="dijit_layout_LayoutContainer_0" class="dijitContainer dijitLayoutContainer       dijitAlignClient" >
     * 
     */
    @FindBy(css="div[id^=\"dijit_layout_LayoutContainer_\"")
    public List<WebElement> dijit_layout_LayoutContainer_;
    /*
     * <span id="TabbedNavigation_tab_0" class="tabLabel" dojoattachpoint="containerNode,focusNode" >
     * 

     */

    @FindAll(value = { @FindBy(className="tabLabel") })
    public List<WebElement> tableauTabbedNavigation_tab_;


...

public SomePage(WebDriver driver){

        super(driver, "Page Title");
        URL = driver.getCurrentUrl();

    }
@Override
public void open(){

    .
    .
    .
    PageFactory.initElements(super.factory, this);
    .
    .
    .
  }

    .
    .
    .

}

实例化或创建此页面的类调用open();

public class LoginPage extends PageBase{

       private WebElement somepage_link; 
       .
       .
       .
        public SomePage clickLinkToSomePage(){

            .
            .
            .

            driver.get(somepage_link.getAttribute("href"));
            somepage_link.click();
            SomePage page = new SomePage(super.getWrappedDriver());
            page.open();
            return page;
        }
    .
    .
    .

}