web-dev-qa-db-ja.com

Chromeドライバーのページ読み込み戦略(Selenium v​​3.12.0まで更新)

WebAppのテストにChromeブラウザーを使用しています。

非常に長い時間後にページがロードされる場合があります。ダウンロードを停止するか、ダウンロード時間を制限する必要がありました。

FireFoxでは、_PAGE_LOAD_STRATEGY = "eager"_について知っています。

クロムに似たものはありますか?

追伸:driver.manage().timeouts().pageLoadTimeout()は機能しますが、その後、Webdriverに対する処理はTimeOutExceptionをスローします。起動を停止した後、ページの現在のURLを取得する必要があります。

9
PanamaBoy

ChromeDriver 77.0(Chromeバージョン77)をサポート)はeageraspageLoadStrategy

解決した問題1902:積極的なページ読み込み戦略のサポート[Pri-2]


Webdriver仕様から:

新しいドキュメントをロードするコマンドの場合、コマンドが戻るポイントは、セッションのページロード戦略によって決定されます

_Page Loading_に時間がかかりすぎて、追加のサブリソース(イメージ、CSS、JSなど)のダウンロードを停止する必要がある場合、pageLoadStrategywebdriverを介して。

この記事の執筆時点では、pageLoadStrategyは次の値をサポートしています。

  1. normal

    この状態により、Seleniumはページ全体のロード(htmlコンテンツとサブリソースのダウンロードと解析)を待機します。

  2. eager

    この状態により、SeleniumはDOMContentLoadedイベント(htmlコンテンツのダウンロードと解析のみ)を待機します。

  3. none

    この戦略により、Seleniumは最初のページコンテンツが完全に受信された(htmlコンテンツがダウンロードされた)直後に戻ります。

デフォルトでは、Seleniumがページをロードすると、normalに従います。 pageLoadStrategy


構成するコードブロックは次のとおりです pageLoadStrategy() の両方のインスタンスを通じてDesiredCapabilitiesクラスおよびChromeOptionsクラスは次のとおりです::

  • DesiredCapabilitiesクラスの使用:

    _package demo; //replace by your own package name
    
    import org.openqa.Selenium.WebDriver;
    import org.openqa.Selenium.chrome.ChromeDriver;
    import org.openqa.Selenium.chrome.ChromeOptions;
    import org.openqa.Selenium.remote.DesiredCapabilities;
    
    public class A_Chrome_DCap_Options {
    
        public static void main(String[] args) {
    
            System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
            DesiredCapabilities dcap = new DesiredCapabilities();
            dcap.setCapability("pageLoadStrategy", "normal");
            ChromeOptions opt = new ChromeOptions();
            opt.merge(dcap);
            WebDriver driver = new ChromeDriver(opt);
            driver.get("https://www.google.com/");
            System.out.println(driver.getTitle());
            driver.quit();
        }
    }
    _
  • ChromeOptionsクラスの使用:

    _package demo; //replace by your own package name
    
    import org.openqa.Selenium.PageLoadStrategy;
    import org.openqa.Selenium.WebDriver;
    import org.openqa.Selenium.chrome.ChromeDriver;
    import org.openqa.Selenium.chrome.ChromeOptions;
    
    
    public class A_Chrome_Options_test {
    
        public static void main(String[] args) {
    
            System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
            ChromeOptions opt = new ChromeOptions();
            opt.setPageLoadStrategy(PageLoadStrategy.NORMAL);
            WebDriver driver = new ChromeDriver(opt);
            driver.get("https://www.google.com/");
            System.out.println(driver.getTitle());
            driver.quit();
        }
    }
    _

pageLoadStrategynormaleagerおよびnoneWebDriver W3C EditorのDraft ですが、pageLoadStrategy値はeagerはまだWIP(Work In Progress)ChromeDriver 実装。詳細な議論は PythonでのChromedriver Seleniumの「熱心な」ページ読み込み戦略の回避策 にあります。


参照:

15
DebanjanB

C#では、PageLoadStrategy.EagerはChromeで機能しないようであるため、WebDriverWaitを使用して自分で作成しました。 PageLoadStrategyをnoneに設定すると、これを行うと基本的にオーバーライドされます。

new WebDriverWait(_driver, TimeSpan.FromSeconds(20))
    .Until(d =>
    {
      var result = ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState");
      return result.Equals("interactive") || result.Equals("complete");
    });

パラメーターとしてchromeドライバーを追加するだけで、TimeSpanは私の場合最大20秒に設定されます。したがって、ページがインタラクティブになるまで最大20秒待機するか、コンプリート

0
Jordan Webster

明示的な待機を使用してみてください。 this リンクにアクセスします。役に立つかもしれません

このコードも試してください:

WebDriver driver = new FirefoxDriver();
String startURL = //a starting url;
String currentURL = null;
WebDriverWait wait = new WebDriverWait(driver, 10);

foo(driver,startURL);

/* go to next page */
if(driver.findElement(By.xpath("//*[@id='someID']")).isDisplayed()){
    String previousURL = driver.getCurrentUrl();
    driver.findElement(By.xpath("//*[@id='someID']")).click();  
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    ExpectedCondition e = new ExpectedCondition<Boolean>() {
          public Boolean apply(WebDriver d) {
            return (d.getCurrentUrl() != previousURL);
          }
        };

    wait.until(e);
    currentURL = driver.getCurrentUrl();
    System.out.println(currentURL);
}   

上記のコードを使用して問題が解決されることを願っています

0