9

Web ページに表示されるコンテンツは、ページの入力要素の状態 (たとえば、入力要素の [大学を選択] は、[仕事] フィールドで [学生] を選択した後にのみ表示される場合があります)、またはいくつかのページ要素 (ドロップダウン メニューなど) のクリックに依存する場合があります。ボタン)。Selenium Webdriver を使用して、そのようなページ要素の依存関係を見つけるプロセスを自動化しようとしています。最初のアイデアは、テキスト入力フィールドに何かを入力し、チェックボックスをオン/オフに設定し、いくつかのボタン/リンクをクリックするなどして、ページ上の要素が表示/非表示になったかどうかを確認することです。問題は次のとおりです。

  • ページに何かが表示されているかどうかを簡単に確認する方法はありますか? 各変更後に Web ページ要素から {'visible', 'invisible'} 状態へのマップを作成し、何かが変更されたかどうかを調べることができますが、この目的のために組み込まれているものはありますか?

  • 一部のボタンをクリックすると、別のページが読み込まれる可能性があり、テスト中のページにとどまりたいのですが、click() メソッドが別のページを読み込み、それを防ぐかどうかを判断する方法はありますか?

4

3 に答える 3

7

質問 2 に対する Divi の回答は問題ありません。パート1では、あなたが言ったように要素が表示されているかどうかを確認できます:

 webElement.isDisplayed();

または、イベント前後のページの html を比較することもできます。

driver.getPageSource();

(各イベント後に URL が変更される場合は、URL を確認することもできます)。

HTML のソースを取得する際の問題の 1 つは、最後のアクションの後にイベントがトリガーされ、完了せず、HTML が同じままになる可能性があることです。これを回避するには、次の条件のいくつかを確認してください。

(Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.ready"); 
((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");

または、jQuery.ready に似た別の機能を持つ別の JavaScript フレームワークを使用している可能性があります。

最後に、アクティブな要素を変更したり、フィールドからタブで移動したりした場合にのみイベントがトリガーされるという問題が発生する可能性があります。したがって、次のようなものを実行できます。

Actions actionObject = new Actions(driver); 
actionObject.sendKeys(Key.TAB).perform();

または、javascript を使用して設定することもできます (以下のコードを確認していないため、webElement を html 基本要素に設定します)。

((JavascriptExecutor) driver).executeScript("arguments[0].focus();", webElement);

最後のクリックが取り消される可能性があるため、webdriver を使用して body 要素をクリックすることはお勧めしません。

完全を期すために、質問2に対するDiviの回答を含めています。

ページの URL を取得し、予想される URL と比較することで、別のページにリダイレクトされているかどうかを確認できます。

WebDriver driver;

driver.getCurrentUrl() // will returns the String value

現在の URL が予想される URL と一致しない場合は、2 つの方法があります。

1) Selenium (または) webdriver navigate メソッドで Open 関数を使用して、予想される URL を再度開くことができます

driver.navigate().to("expected_url");

2) 戻るナビゲーションを使用できます

driver.navigate().back();
于 2012-08-30T00:10:55.293 に答える
3

ジェームズの回答に基づいており、テストサイトはjQueryを使用していないため、次のことがうまくいきました:

public static class WebDriverExtensions
{
    public static void WaitForPage(this IWebDriver driver)
    {
        WaitForPage(driver, 60, 200);
    }

    private static void WaitForPage(IWebDriver driver, int seconds, int waitFor)
    {
        while (!((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"))
        {
            System.Threading.Thread.Sleep(50);
        }
        bool stillChanging = true;
        int iterations = 0;
        int maxIterations = (1000 * seconds) / waitFor;
        string previous = "";
        string current = "";
        while (stillChanging && iterations < maxIterations)
        {
            current = driver.PageSource;
            System.Threading.Thread.Sleep(waitFor);
            stillChanging = (!previous.Equals(current));
            previous = current;
        }
    }

    public static void Click(this IWebElement el, IWebDriver driver)
    {
        el.Click();
        driver.WaitForPage();
    }
 }

私のコードでは、el.Click() の代わりに el.Click(driver) を呼び出します。ページの変更が停止した後、メソッドは戻ります。ページ上の何かを変更する可能性のある変更の前後に、public driver.WaitForPage() メソッドを呼び出すこともできます。ハードコーディングされた値を変更して、最大タイムアウトと変更のチェック間の期間が期待どおりに機能するようにする必要があります。waitFor を小さくしすぎると、変更を検出できなくなります。大きすぎると、クリックするたびに長時間待たなければならなくなります。

于 2013-06-05T08:24:20.780 に答える
1

Javaでの可視性を確認するための最初の質問です。

Selenium selenium;

selenium.isVisible("id=element_id"); // it will return boolean value whether the element is present or not 

webDriverを使用する場合は、

RenderedWebElement webElement=findElement(By.id("element_id"));
webElement.isDisplayed();

2番目の質問について

ページのURLを取得し、予想されるURLと比較することで、別のページにリダイレクトされているかどうかを確認できます。

WebDriver driver;

driver.getCurrentUrl() // will returns the String value

現在のURLが予想されるURLと一致しない場合は、2つの方法があります。

1)Selenium(または)WebドライバーのNavigateメソッドでOpen関数を使用して、予想されるURLを再度開くことができます

driver.navigate().to("expected_url");

2)バックナビゲーションを使用できます

driver.navigate().back();
于 2012-08-27T09:49:57.707 に答える