【问题标题】:Finding all web elements using Ruby and Selenium使用 Ruby 和 Selenium 查找所有 Web 元素
【发布时间】:2014-05-28 09:27:10
【问题描述】:

我是一个 Ruby 和 Selenium Webdriver 菜鸟...

我不想一次抓取一个元素并将其放入变量中,而是一次抓取所有 Web 元素,包括按钮、字段等。

我尝试从网上获取 find_elements 的示例,但它不起作用,所以我做错了。

那么我需要做什么来抓取网页的所有元素,然后如何使用特定的元素?

谢谢, 斯科特

【问题讨论】:

  • 为什么需要这样做?您可以创建一个 xpath 或 css 选择器来一次获取您想要的所有元素并将它们存储在一个数组中,但我认为这不是一个很好的做法。只需在需要时获取所需的任何元素。
  • 那么,您想模拟类似Object spyQTP 类型的工具吗?
  • 这是非常糟糕的做法,而且没有简单的方法可以做到这一点。自动化的典型方法是一次完成一个元素。
  • 好的,谢谢,我想我的做法是正确的。我试图变得有点懒惰,因为一个表单中有大约 30 个字段,我真的不想一次学习所有对象。但如果这是最好的方法,让我开始吧。再次感谢大家。

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


【解决方案1】:

请原谅我不知道 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;
        }
    .
    .
    .

}

【讨论】:

    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2013-11-10
    • 2015-11-10
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多