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 に答える