web-dev-qa-db-ja.com

SeleniumテストでChromedriverがページをロードしない

Seleniumを使用して作成しているいくつかの単体テストでchromedriver.exeを使用した例外シナリオが発生しています。 chromedriverを使用する最初のテストが実行されると、ブラウザーが起動し、テストに合格します。

ただし、chromedriverを使用する以下のすべてのテストでは、ブラウザーはURLに正常に移動しません。

ブラウザが起動し、一時的に文字data;がアドレスバーに表示され(最初のテストで機能したように)、正しいURLがアドレスバーに挿入されます。ただし、ページが読み込まれることはなく、2つのボタンを使用してブラウザの本体/キャンバスに標準のchrome このWebページは使用できませんメッセージが表示されますリロードおよびもっと

これは既知の問題ですか?

私は次のバージョンを使用しています:

セレン:2.41.0.0
Chromedriver.exe:2.9.0.0
Visual Studio 2013:12.0.30110.00アップデート1

次のInitializeメソッドが私のChromeTestDriverクラスにあり、すべてのテストのSetupメソッド(別名TestInitialize)で呼び出されます。

ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService(DriverPath);
var chromeOptions = new ChromeOptions();

chromeDriverService.Port = DriverPort; // 9999 - this is the port for the driver, not the webpage 

webDriver = new ChromeDriver(chromeDriverService, chromeOptions);
webDriver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
webDriver.Manage().Timeouts().SetScriptTimeout(TimeSpan.FromSeconds(10)); 

すべてのテストのCleanupメソッド(別名Teardown)に次のコードがあります。

TestDriver.CloseWindow();  
TestDriver.Quit();

次の例外が発生します。

OpenQA.Selenium.NoSuchWindowException:そのようなウィンドウはありません:ターゲットウィンドウはすでに閉じられています

さらに情報を提供できるかどうか教えてください。

編集 IEテストを最初に実行してからChromeが失敗することを確認しました。通常、次のことが起こります。A= Chromeテストは正常に実行されます。その後、IEテストが実行されます。その後、すべてのChromeテストが失敗します。

さらに編集これに対するもう1つの珍しい側面は、chromeがWebサイト用にSeleniumによって汚された後、Chromeまったく。つまり、Chromeのアドレスバーに手動でURLを入力すると、同じ空のページが表示されます。

さらに奇妙なことに、Fiddler2(基本的にはプロキシ)を実行すると、Chromeは汚されなくなり、再び機能します。

私のシステムにはプロキシがなく、Fiddler2がシステムからアンインストールされたときに同じ結果が発生するため、プロキシは問題ではないと確信しています。

症状は、別の大陸にいる私のクライアントによっても再現可能です。 GITを使用してコラボレーションします。したがって、それは私のシステムに限定されません。

Selenium Googleユーザーグループのユーザーは、非常に単純なシナリオで(つまり、テストフレームワークの一部としてではなく)Webドライバーを使用してバグを再現することを提案しました。これを行うために作成したコンソールアプリのコードは次のとおりです。

private static string Url = "http://localhost:5556";

static void Main(string[] args)
{
    var chromeWebDriver = GetChromeWebDriver();
    var nav = chromeWebDriver.Navigate();
    nav.GoToUrl(Url);
    Thread.Sleep(3000);
    chromeWebDriver.Quit();
    chromeWebDriver.Dispose();

    var iedriver = GetIeDriver();
    var nav1 = iedriver.Navigate();
    nav1.GoToUrl(Url);
    iedriver.Quit();
    iedriver.Dispose();

    var chromeWebDriver2 = GetChromeWebDriver();
    var nav2 = chromeWebDriver2.Navigate();
    nav2.GoToUrl(Url);
    chromeWebDriver2.FindElement(By.LinkText("Login")).Click();

    System.Threading.Thread.Sleep(2000);

    chromeWebDriver2.Quit();
    chromeWebDriver2.Dispose();

    Console.ReadLine();
}

private static IWebDriver GetIeDriver()
{
    InternetExplorerDriverService internetExplorerDriverService =
        InternetExplorerDriverService.CreateDefaultService(
            @"H:\BW\packages\Selenium.WebDriver.IEDriver.2.41.0.1\content");
    InternetExplorerOptions internetExplorerOptions = new InternetExplorerOptions();
    internetExplorerDriverService.Port = 9999;
    IWebDriver webdriver = new InternetExplorerDriver(internetExplorerDriverService, internetExplorerOptions);
    return webdriver;
}

private static IWebDriver GetChromeWebDriver()
{
    var chromeDriverService =
        ChromeDriverService.CreateDefaultService(
            @"H:\BW\packages\Selenium.WebDriver.ChromeDriver.2.10.0.0\content");
    var chromeOptions = new ChromeOptions();
    chromeDriverService.Port = 7777;
    IWebDriver chromeWebDriver = new ChromeDriver(chromeDriverService, chromeOptions);
    return chromeWebDriver;
}
12
onefootswill

このコードを試してください。それは簡単で、あなたの問題を解決します。

if(browserType.equals("googleChrome")==true)
{

    System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"\\autoItfiles\\chromedriver.exe");
    driver = new ChromeDriver();

    Report.info("Google chrome browser is opened ");                
}

//ブラウザインスタンスを閉じます。 close()メソッドはほとんど使用しないでください。Firefox以外では機能しません。

driver.quit();

Closeは現在アクティブなウィンドウを閉じ、それが最後のウィンドウである場合はquit()を実行します。

テストが失敗した場合、そのセッションはおそらく終了しているため、closeを呼び出すと、コマンドの送信先がわからず、何も実行されません。

アクティブなセッションがない場合、Quitはすべてのクライアントをシャットダウンするため、quitを送信してアクティブなセッションがない場合は、クリーンアップするだけです。

1
Hariprasad

すべてのドライバーに同じポートを指定していますか?もしそうなら、それが問題を引き起こしている可能性が最も高いです。シナリオでは、IEDriverServerはポート9999でリッスンしています。次に、ChromeDriverを起動すると、ポート9999も使用しようとしますが、すでに使用されているため使用できないため、ページが見つかりませんというエラーが発生します。

ドライバーに独自のポートを取得させてみてください。これにより、使用可能なポートが自動的に検出され、何が起こるかがわかります。

0
PocketDews

これは、ChromeDriverが許可されたローカル接続のみのステートメントで開始され、特定のポートを使用することを示すため、ポート番号を示すことで私の問題を解決しました。

public static void main(String ... args){
    System.setProperty("webdriver.chrome.driver", "C:\\chromedriver\\2.16\\chromedriver.exe");
    ChromeDriverService.Builder builder =  new ChromeDriverService.Builder();
    ChromeDriverService srvc = builder.usingDriverExecutable(new File("C:\\chromedriver\\2.16\\chromedriver.exe"))
                        .usingPort(9515).build();
    try {
        srvc.start();
    } catch (IOException e) {
        e.printStackTrace();
    }

    //Execute your test-script commands
    WebDriver driver = new ChromeDriver(srvc);
    driver.get("http://www.google.com");
    WebElement searchBox = driver.findElement(By.name("q"));
    searchBox.sendKeys("Chrome Driver");
}
0
seleniumlearner

同じ問題が発生しました。これは、間違ったChromeDriverを使用していたことが原因でした。公式サイト http://www.seleniumhq.org/download/)のサードパーティのブラウザドライバからドライバをダウンロードすることをお勧めします。

0
grijesh agrawal

目的にかなうようにTestDriver.Quit();を直接使用できます。ウィンドウは自動的に閉じられます。コードに追加のメソッド、つまりTestDriver.CloseWindow();ifを含める必要はありません。 =開いている複数のウィンドウを処理していません。

0
Varun Bajpai

Chromedriverv2.7でお試しください

私も同じ問題に直面したので

0
Shyamala