0

Selenium、特に WebDriver v2.31 を取得して、Google マップとやり取りしようとしています。[最初の] [Get Directions] ボタンをクリックして住所のペアを入力し、2 つの住所の下にある [Get Directions] ボタンをクリックするところまで到達できます。これにより、ルート案内のセットが作成されます。私ができないのは、Selenium を [ルート案内] パネルの一番下までスクロールして、目的地と [マイマップに保存] リンクを表示できるようにすることです。ブラウザがスクロールバーを生成するため、問題が発生するかどうかはわかりません。

Yahoo!で検索できるようになりました。結果の Web ページの一番下までスクロールします。Webページのアーキテクチャに他のフレームやパネルがないためだと思います。そうは言っても、ブラウザは Web ページではなく、スクロール バーを生成しました。

マウスを押したままスクロール バーを下にドラッグすると、アクションを作成できます。ページのサイズが異なるか、パネルのサイズが異なる場合、このアクションを実行するために多くの再計算が発生するため、このソリューションは好きではありません。Yahoo! の単一の「ドキュメント」ウィンドウに似たソリューションを希望します。またはGoogleコード。

どんな助けでも大歓迎です。私は過去 3 日間、解決策を探してインターネットで頭を悩ませてきました。

ありがとう。

スティーブ

補遺: 以下のとおり。私は地図自体ではなく、道順を含むパネルで何かをしようとしています。後でテストする必要があるアプリケーションに似ているため、Google マップを使用しています。[Selenium] WebDriver をパネルの一番下までスクロールして、「次へ」リンクを選択できるようにする機能が必要です。これは、Google マップの [ルート案内] パネルの一番下までスクロールして、一番下に [保存] リンクが表示されるのと同じです。

パネルという用語を使用するときに、正しい用語を使用しているかどうかわかりません。問題は、Web ページが表示されたときにパネルが動的にスクロール バーを生成するように見えることです。

driver.switchTo().frame(driver.findElement(By.id("spsizer")));
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("javascript:window.scrollBy(250,750)", element);
driver.switchTo().defaultContent();

残念ながら、「パネル」はフレームに含まれていないか、フレームです... Selenium によって返される例外によって識別されます。

 Exception in thread "main" org.openqa.selenium.NoSuchFrameException: Element is not a frame element: DIV

FireBug を使用して、パネルに ID (「spsizer」) があると判断したと思います。

これも機能しません:

element = driver.findElement(By.id("spsizer"));
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("javascript:window.scrollBy(250,750)", element);

これは [ルート案内] パネルの一番下までスクロールせずに実行されますが、例外もスローされません。

4

2 に答える 2

1

以下のスクリーン ショットに示す次のコードを使用して、[マイ マップ] リンクに保存できます

パネルを下にスクロールする手順を記録する必要はありません。Selenium は、ユーザーに表示されることなく、Web ページ内の任意の Web オブジェクトを見つけてアクションを実行できます。

ここに画像の説明を入力

コードの詳細:

6 行目: Command- waitForVisible Target- //div[@id='dir_sr']/a[@id='srlink']

Selenium が[マイ マップに保存]リンクが表示されるまで 5 秒間待機するように、waitForVisibleを追加しました。これにより、 Get Directionsボタンを押した後にページをロードするのに十分な同期時間が得られます。//div[@id='dir_sr']/a[@id='srlink']はリンクの XPath ロケータです[マイマップに保存]

Line7: Command-クリック Target- //div[@id='dir_sr']/a[@id='srlink']

[マイマップに保存]リンクをクリックします

Line8: Command-クリック Target- //button[@id='srsave']

ボタンをクリックして保存

同じためのC#.Net WebDriverコード。マップ リンクを保存するには、Google アカウントのユーザー名とパスワードを入力する必要があることに注意してください。

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;

namespace SeleniumTests
{
    public class GoogleMapSavingTest
    {
          static void Main(string[] args)
          {
              IWebDriver driver = new FirefoxDriver();
              driver.Navigate().GoToUrl("https://maps.google.com.au/");
              driver.FindElement(By.Id("d_launch")).Click();
              driver.FindElement(By.Id("d_d")).Clear();
              driver.FindElement(By.Id("d_d")).SendKeys("Franklin, ACT");
              driver.FindElement(By.Id("d_daddr")).Clear();
              driver.FindElement(By.Id("d_daddr")).SendKeys("Gungahlin, ACT");
              driver.FindElement(By.Id("d_d")).Click();
              driver.FindElement(By.Id("d_sub")).Click();
              for (int second = 0;; second++) 
              {
                    if (second >= 60) Assert.Fail("timeout");
                     try
                     {
                        if  (driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Displayed) break;
                    }
                    catch (Exception)
                    {}
                    Thread.Sleep(1000);
                }
             driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Click();
                driver.FindElement(By.Id("Email")).SendKeys("UserName");
                driver.FindElement(By.Id("Passwd")).SendKeys("Password");
                driver.FindElement(By.Id("signIn")).Click();
                for (int second = 0; ; second++)
                {
                    if (second >= 60) Assert.Fail("timeout");
                    try
                    {
                        if (driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Displayed) break;
                    }
                    catch (Exception)
                    { }
                    Thread.Sleep(1000);
                }
             driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Click();
            driver.FindElement(By.XPath("//button[@id='srsave']")).Click();


          }





}

}

于 2013-03-21T12:37:25.697 に答える
0

地図アプリケーションを自動化するために設計された、誰かが GitHub で作成した Selenium の拡張機能があることは知っていますが、それを見つける方法を覚えていません。数週間前に GitHub をブラウジングしているときに見ましたが、javascript による画像認識を使用しています (Sikuli のことではありません)。あなたが探しているものは、一生懸命探せば存在すると思います。

リモート グリッドを使用している場合は、Sikuli を使用しないでください。また、iframe が関係している場合は、フレームの自動化をあきらめる前に、常に JavaScriptExecutor (switchTo フレームを使用) を試すことをお勧めします。

それまでは、WebDriverJSを調べることから始めることができます。また、GhostDriverは、アイデアを得るだけでも一見の価値があるかもしれません。

于 2013-03-20T20:35:19.507 に答える