2016-09-14 2 views
2

私は<select>のサイトを持っています。そのサイトには、世界のすべての国に1つずつ、<option>が100以上あります。私のテストは1つを選択する必要があります。現在の私の解決策は、約2.5秒かかります。私はそれがはるかに速くなるようにしたいと思います。 Haskellとwebdriverを使用してドロップダウンからオプションをすばやく選択するにはどうすればよいですか?

findChildrenByLabel :: (WD.WebDriver m, MonadIO m) => 
    Text -> Text -> m [WD.Element] 
findChildrenByLabel label tagName = do 
    parentEl <- findFieldByLabel label 
    WD.findElemsFrom parentEl $ WD.ByTag tagName 

findChildByLabelF :: (WD.WebDriver m, MonadIO m) => 
    Text -> Text -> (WD.Element -> m Bool) -> m WD.Element 
findChildByLabelF label tagName f = do 
    children <- findChildrenByLabel label tagName 
    child <- filterM f children 
    liftIO $ child `shouldSatisfy` ((==1) . length) 
    return (headEx child) 

selectDropdownByLabel :: (WD.WebDriver m, MonadIO m) => Text -> Text -> m() 
selectDropdownByLabel label optionName = do 
    targetOption <- findChildByLabelF 
    label "option" (\el -> (== optionName) <$> WD.getText el) 
    WD.click targetOption 

私はJavaでthis SO answerを見つけましたが、HaskellのためのSelenium.SupportまたはSelectByTextのようなものがあるようには思えません。 danidiazの答えに基づいて

+2

'' WD.findElemsFrom'のすべてのオプションを抽出するようになっています。おそらく '' // option [contains(text()、 'SomeOption')] '' 'のように動的に生成されたXPath式を使って特定のオプションを対象にしています。 'WD.getText'への複数の呼び出しを保存するようです。 – danidiaz

答えて

0

は、私がこれを書いた:私はこのようにそれを使用

findFieldByLabel :: (WD.WebDriver m, MonadIO m) => Text -> m WD.Element 
findFieldByLabel str = do 
    labels :: [WD.Element] <- WD.findElems $ WD.ByXPath $ 
    "//label[text() = \"" <> str <> "\"]" 
    els <- catMaybes <$> mapM (`WD.attr` "for") labels 
    liftIO $ els `shouldSatisfy` ((==1) . length) 
    WD.findElem $ WD.ById $ headEx els 

selectDropdownByLabel :: (WD.WebDriver m, MonadIO m) => Text -> Text -> m() 
selectDropdownByLabel label optionName = do 
    field <- findFieldByLabel label 
    targetOptions <- WD.findElemsFrom field $ WD.ByXPath $ 
    "option[text() = \"" <> optionName <> "\"]" 
    liftIO $ targetOptions `shouldSatisfy` ((==1) . length) 
    WD.click $ headEx targetOptions 

を:

selectDropdownByLabel "Country of residence" "United States" 

元の溶液は、約2.5秒かかりました、これは約0.16です。大きな改善、感謝danidiaz!

関連する問題