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;
}
このコードを試してください。それは簡単で、あなたの問題を解決します。
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を送信してアクティブなセッションがない場合は、クリーンアップするだけです。
すべてのドライバーに同じポートを指定していますか?もしそうなら、それが問題を引き起こしている可能性が最も高いです。シナリオでは、IEDriverServerはポート9999でリッスンしています。次に、ChromeDriverを起動すると、ポート9999も使用しようとしますが、すでに使用されているため使用できないため、ページが見つかりませんというエラーが発生します。
ドライバーに独自のポートを取得させてみてください。これにより、使用可能なポートが自動的に検出され、何が起こるかがわかります。
これは、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");
}
同じ問題が発生しました。これは、間違ったChromeDriverを使用していたことが原因でした。公式サイト http://www.seleniumhq.org/download/)のサードパーティのブラウザドライバからドライバをダウンロードすることをお勧めします。 。
目的にかなうようにTestDriver.Quit();
を直接使用できます。ウィンドウは自動的に閉じられます。コードに追加のメソッド、つまりTestDriver.CloseWindow();
ifを含める必要はありません。 =開いている複数のウィンドウを処理していません。
Chromedriverv2.7でお試しください
私も同じ問題に直面したので