有没有办法使用Selenium自动获取页面上的所有元素?

时间:2011-01-17 18:44:16

标签: ruby-on-rails selenium automated-tests

在为.Net应用程序创建测试时,我可以使用White库查找给定类型的所有元素。然后,我可以将这些元素写入Xml文件,以便可以引用它们并将其用于GUI测试。这比手动记录每个元素的信息要快得多,所以我想对使用Selenium的Web应用程序做同样的事情。我还没有找到任何关于此的信息。

我希望能够搜索给定类型的每个元素并保存其信息(位置/ XPath,值和标签),以便稍后将其写入文本文件。

这是我想要达到的理想工作流程:

navigate_to_page(http://loginscreen.com)
log_in
open_account
button_elements = grab_elements_of_type(button) # this will return an array of XPaths and Names/IDs/whatever - some way of identifying each grabbed element

该代码可以运行一次,然后我可以在任何元素被更改,添加或删除时重新运行它。

然后我可以让另一个自定义函数遍历数组,以稍后我可以轻松使用的格式保存信息;在这种情况下,Ruby类包含常量列表:

LOGIN_BUTTON = "//div[1]/loginbutton"
EXIT_BUTTON = "//div[2]/exitbutton"

然后我可以编写看起来像这样的测试:

log_in # this will use the info that was automatically grabbed beforehand
current_screen.should == "Profile page"

现在,每次我想要与新元素进行交互时,我都必须手动转到页面,选择它,用XPather打开它,然后将XPath复制到我希望代码查看的任何文件中。这花费了很多时间,否则可能会花在编写代码上。

3 个答案:

答案 0 :(得分:1)

最终您正在寻找的是将您在测试中记录的信息提取到可重用的组件中。

  1. 使用Selenium IDE插件在Firefox中记录您的测试。
  2. 将您录制的测试导出到.cs文件中(假设您提到了.NET,但也提供了Ruby导出选项)
  3. 解压缩XPath / CSS ID并将它们封装到可重用的类中,并使用PageObject模式表示每个页面。
  4. 使用上述技术,您只需使用更新的定位器更新PageObject,而不是重新录制测试。


    <强>更新

    您想要自动记录部分吗?听起来很尴尬。也许你想从特定页面中提取所有超链接并对它们执行相同的操作?

    您应该使用Selenium的对象模型来针对DOM编写脚本。

    [Test]
    public void GetAllHyperLinks()
    {
        IWebDriver driver = new FireFoxDriver();
        driver.Navigate().GoToUrl("http://youwebsite");
    
        ReadOnlyCollection<IWebElement> query 
                 = driver.FindElements( By.XPath("//yourxpath") );
    
        // iterate through collection and access whatever you want
        // save it to a file, update a database, etc...
    
    }
    

    更新2:

    好的,所以我现在理解你的担忧。您希望将定位器从网页中取出以供将来参考。挑战在于构建定位器!

    构建定位器会遇到一些挑战,特别是如果有多个实例,但是你应该能够使用Selenium支持的基于CSS的定位器来实现足够的目标。

    例如,您可以使用xpath“// a”找到所有超链接,然后使用Selenium构建CSS定位器。您可能必须自定义定位器以满足您的需要,但示例定位器可能正在使用超链接的css类和文本值。

    //a[contains(@class,'adminLink')][.='Edit']
    
    // selenium 2.0 syntax
    [Test]
    public void GetAllHyperLinks()
    {
        IWebDriver driver = new FireFoxDriver();
        driver.Navigate().GoToUrl("http://youwebsite");
    
        ReadOnlyCollection<IWebElement> query 
                 = driver.FindElements( By.XPath("//a") );
    
        foreach(IWebElement hyperLink in query)
        {
            string locatorFormat = "//a[contains(@class,'{0}')][.='{1}']";
    
            string locator = String.Format(locatorFormat,
                                       hyperlink.GetAttribute("class"),
                                       hyperlink.Value);
    
            // spit out the locator for reference.
        }
    
    }
    

    您仍然需要将定位器与您的代码文件相关联,但这至少应该通过提取定位器以便将来使用来开始。

    以下是使用Selenium 1.0 http://devio.wordpress.com/2008/10/24/crawling-all-links-with-selenium-and-nunit/

    抓取链接的示例

答案 1 :(得分:0)

Selenium在浏览器端运行,即使你可以获取所有元素,也无法将其保存在文件中。据我所知,Selenium不适用于那种工作。

答案 2 :(得分:0)

您需要获取整个页面来源吗?如果是这样,请尝试GetHtmlSource方法 http://release.seleniumhq.org/selenium-remote-control/0.9.0/doc/dotnet/html/Selenium.DefaultSelenium.GetHtmlSource.html