Seleniumテスト自動化をヘッドレスchromeに対して実行して、TeamCityに移動できるようにしようとしています。運がありません。実行すると、Chromeはヘッドレスで実行されているように見えますが(ブラウザがポップアップしません)、NoSuchElementException
が表示されます。ヘッドレスで実行されていない場合は自動化が期待どおりに機能します。
私はこの問題を広範囲に調査しましたが、自分に合った解決策を見つけることができませんでした。この問題は https://bugs.chromium.org/p/chromedriver/issues/detail?id=476 で報告されたようですが、修正済みとマークされています。問題は、間違ったchromedriver、または間違ったchromedriver/Seleniumの組み合わせである可能性があると思いますが、私はあらゆる種類の組み合わせを試しましたが、愛はありません。
私は使っている:
私のコードは:
...
ChromeOptions headlessOptions = new ChromeOptions();
headlessOptions.addArguments("--start-maximized");
headlessOptions.addArguments("--headless");
driver = new ChromeDriver(headlessOptions);
driver.get(url);
WebElement usernameTextfield = driver.findElement(By.cssSelector(".input.username"));
...
そして、出力は次のとおりです。
Starting ChromeDriver 2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f) on port 41402
Only local connections are allowed.
Nov 01, 2017 10:22:51 AM org.openqa.Selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
org.openqa.Selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":".input.username"}
(Session info: headless chrome=62.0.3202.75)
(Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
これにより、テスト自動化をCIの一部として含めることができなくなっているため、ご協力いただければ幸いです。
私は同じ問題を抱えていました、ローカルサーバーは自己署名証明書を使用していました、これが私のために働いた組み合わせです:
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--disable-gpu");
options.addArguments("--no-sandbox");
options.addArguments("--allow-insecure-localhost");
これは私のために働いたものです:
var chromeOptions = new ChromeOptions();
chromeOptions.AddArguments("--headless");
chromeOptions.AddArguments("--disable-gpu");
chromeOptions.AddArguments("--window-size=1280,800");
chromeOptions.AddArguments("--allow-insecure-localhost");
//specifically this line here :)
chromeOptions.AddAdditionalCapability("acceptInsecureCerts", true, true);
https://bugs.chromium.org/p/chromium/issues/detail?id=721739 から見つかりました
これを試して:
final ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--window-size=1280,800");
WebDriver driver = new ChromeDriver(options);
Chromedriver/Seleniumの組み合わせは完璧に見えます。私には、同期の問題のようです。次のように、サイクアップするのを待つ必要があります。
driver.get(url);
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement usernameTextfield = wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.cssSelector(".input.username"))));
usernameTextfield.sendKeys("user_name");