Ich versuche, meine Selenium-Testautomatisierung gegen kopfloses Chrom laufen zu lassen, damit ich sie auf TeamCity verschieben kann. Ich habe kein Glück gehabt. Wenn ich es starte, scheint Chrome kopflos zu laufen (es erscheint kein Browser), aber ich erhalte eine NoSuchElementException
. Die Automatisierung funktioniert wie erwartet, wenn sie nicht kopflos ausgeführt wird. Ein Schnappschuss zeigt nur ein weißes Rechteck.
Ich habe dieses Problem eingehend untersucht, konnte jedoch keine für mich geeignete Lösung finden. Es scheint, dass das Problem in https://bugs.chromium.org/p/chromedriver/issues/detail?id=476 gemeldet wurde, aber als behoben markiert ist. Ich denke, das Problem könnte der falsche Chromtreiber oder die falsche Chromtreiber/Selen-Kombination sein, aber ich habe alle möglichen Kombinationen ausprobiert und keine Liebe.
Ich benutze:
Mein Code ist:
...
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"));
...
Und die Ausgabe ist:
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
Dies hindert mich daran, meine Testautomatisierung in unser CI aufzunehmen. Daher wäre jede Hilfe sehr willkommen.
Ich hatte das gleiche Problem, der lokale Server verwendete ein selbstsigniertes Zertifikat. Die folgende Kombination hat bei mir funktioniert:
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--disable-gpu");
options.addArguments("--no-sandbox");
options.addArguments("--allow-insecure-localhost");
Das hat bei mir funktioniert:
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);
Gefunden von https://bugs.chromium.org/p/chromium/issues/detail?id=721739
Versuche dies:
final ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--window-size=1280,800");
WebDriver driver = new ChromeDriver(options);
Ihre Chromedriver/Selen-Kombination sieht perfekt aus. Scheint mir ein mühsames Synchronisationsproblem zu sein. Wir müssen einige Wartezeiten einleiten, um Folgendes abzusprechen:
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");