4

我正在尝试使用 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()
4

2 回答 2

6
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”的函数,它接受一个选择器或一个元素。由于您从“元素“选择器”中获得了所有这些元素,因此您可以映射读取列表。

List.map 接收一个函数,运行它,然后返回一个结果列表。(在 C# 中,其类似 elements.Select(x => read(x)) List.iter 与 .foreach(x => System.Console.Writeline(read(x)) 相同

于 2014-04-09T22:04:37.757 回答
0

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

因此,您在这里获得了与选择器“.application-tile”匹配的元素列表。List.map 需要一个 lambda,它接受一个 IElement(元素中包含的类型),它将把它投影到一个新的形式(通用的 'a)中。

我对这个框架了解不多,但我不确定你为什么要获取一个元素,然后将它传递到另一个元素调用中。

进一步查看文档,我们发现 read 函数:“读取元素的文本(或值或选定选项)。” 这是你想要的吗?

于 2014-04-09T20:50:28.493 回答