使用F#和Canopy进行现场抓取

时间:2014-04-09 20:42:19

标签: f# canopy-web-testing

我正在尝试使用F#和Canopy编写一个简单的刮刀(参见http://lefthandedgoat.github.io/canopy/)。我试图从类“.application-tile”中提取所有元素的文本。但是,在下面的代码中,我得到以下构建错误,我不明白。

This expression was expected to have type
    OpenQA.Selenium.IWebElement -> 'a    
but here has type
    OpenQA.Selenium.IWebElement

知道为什么会这样吗?谢谢!

open canopy
open runner
open System

[<EntryPoint>]
let main argv = 
    start firefox

    "taking canopy for a spin" &&& fun _ ->
        url "https://abc.com/"

        // Login Page
        "#i0116" << "abc@abc.com"
        "#i0118" << "abc"
        click "#abcButton"

        // Get the Application Tiles -- BUILD ERROR HAPPENS HERE
        elements ".application-tile" |> List.map (fun tile -> (tile |> (element ".application-name breakWordWrap"))) |> ignore

    run()

2 个答案:

答案 0 :(得分:5)

open canopy
open runner

start firefox

"taking canopy for a spin" &&& fun _ ->
    url "http://lefthandedgoat.github.io/canopy/testpages/"

    // Get the tds in tr
    let results = elements "#value_list td" |> List.map read

    //or print them using iter
    elements "#value_list td" 
        |> List.iter (fun element -> System.Console.WriteLine(read element))

run()

那应该做你想要的。

canopy具有称为“read”的函数,它接收选择器或元素。由于你拥有来自'elements'选择器''的所有这些,你可以在列表上映射读取。

List.map接受一个函数,运行它,并返回一个结果列表。 (在C#中它的元素相同。选择(x =&gt; read(x)) List.iter与.foreach相同(x =&gt; System.Console.Writeline(read(x))

答案 1 :(得分:0)

我相信错误发生在List.map调用中的投影lambda中。从冠层文档elements返回与css选择器或文本匹配的所有元素。 element获取具有给定css选择器或文本的元素。

所以在这里你要获得一个与选择器匹配的元素列表&#34; .application-tile&#34;。 List.map需要一个lambda,它接受一个I​​Element(元素中包含的类型),将它投影到一个新的形式(通用&#39; a)。

我对这个框架一无所知,但我不确定你为什么要采用一个元素,然后再将其用于另一个元素调用。

通过文档进一步查看read函数: &#34;阅读元素的文本(或值或选定选项)。&#34;这是你想要的吗?