【问题标题】:Is there a way to automatically grab all the elements on the page using Selenium?有没有办法使用 Selenium 自动抓取页面上的所有元素?
【发布时间】:2011-01-17 18:44:16
【问题描述】:

在为 .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 复制到我希望我的代码查看的任何文件中。这会占用大量原本可以用于编写代码的时间。

【问题讨论】:

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


    【解决方案1】:

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

    1. 使用 Selenium IDE 插件在 Firefox 中记录您的测试。
    2. 将您记录的测试导出到 .cs 文件中(假设您提到 White 是 .NET,但也可以使用 Ruby 导出选项)
    3. 提取 XPath / CSS Id 并将它们封装到可重用的类中,并使用 PageObject 模式来表示每个页面。

    使用上述技术,您只需使用更新的定位器更新您的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/ 抓取链接的示例

    【讨论】:

    • 我想做的是自动化“记录你的测试”部分。我已经有了使用 Ruby on Rails 和 RSpec 编写测试的基线。问题在于我必须手动复制到这个系统中的元素路径的数量。
    • 我想提取所有按钮、所有图像、所有标签、所有文本框等并保存它们的 XPath。理想情况下,对于每个元素,我会得到一个唯一的名称、一个值(如果默认有一个值)和一个 XPath。然后我可以有一个名为 enter_username 的函数,该函数将使用其 XPath 对正确的元素执行适当的 Selenium 命令;除了我不必手动找到那个 XPath。然后我可以编写类似“get_text(LoginElements::UsernameField).should == ''”的测试,其中 LoginElements::UsernameField 将是“//div[@id='login_div']/dl/dt[5]”一个元素文件。
    • 听起来很有趣,但是当您决定不使用 UsernameField 或更改表单的验证逻辑时,您的所有测试都会被破坏。 PageObjects 是要走的路。
    • 实现 PageObjects 的问题是我使用的现有代码库已经完成了 很多 个测试。我真的不想重构所有这些。唯一的问题是,在测试期间为我想与之交互的每个元素手动查找 XPath 非常耗时,因此是个问题。
    • 我在使用此代码时遇到的问题是,我使用的是 Selenium 的替代版本,它似乎没有您在此处使用的方法。 selenium-client.rubyforge.org
    【解决方案2】:

    Selenium 在浏览器端运行,即使你可以抓取所有元素,也无法将其保存在文件中。据我所知,Selenium 不是为这类工作而设计的。

    【讨论】:

    • 我已经有了一个系统,可以使用 Ruby 将内容实际写入文本文件。我只需要获取元素信息。
    【解决方案3】:

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

    【讨论】:

    • 我不需要整个源代码。只是每种类型(文本、文本框、按钮、图像、超链接等)的每个元素的 XPath。
    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 2018-05-29
    • 2012-01-12
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多