我正在尝试使用 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" << "[email protected]"
        "#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()

最佳答案

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# 中它喜欢元素。选择(x => 读取(x))
List.iter 与 .foreach(x => System.Console.Writeline(read(x)) 相同

关于f# - 使用 F# 和 Canopy 进行站点抓取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22973501/

10-12 07:34