Selenium troubleshooting
Osalla on ollut ongelmia Seleniumin toiminnan kanssa. Alla muutamia tapoja, miten ongelmat on saatu ratkaisuta. Jos törmäät ongelmaan ja saat sen ratkaistua jollain alla mainitsemattomalla tavalla, lisää ohje dokumenttiin editoimalla tätä
Tapa 1: HtmlUnit-driver
HtmlUnitDriver on ns. headless-selain, eli sillä ei ole graafista käyttöliittymää. Jos haluat tietää millä sivulla selain on menossa, joudut esim. tulostamaan sivun lähdekoodin konsoliin komennolla System.out.println(driver.getPageSource());
.
Ota HtmlUnitDriver käyttöön seuraavasti:
...
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
public class Tester {
public static void main(String[] args) {
WebDriver driver = new HtmlUnitDriver();
driver.get("http://localhost:4567");
// tulostetaan sivu konsoliin
System.out.println(driver.getPageSource());
WebElement element = driver.findElement(By.linkText("login"));
element.click();
// tulostetaan sivu konsoliin
System.out.println(driver.getPageSource());
// ...
driver.quit();
}
}
HtmlUnitDriver:in hyvä puoli on nopeus. Voit käyttää sitä myös testeissä. Testien debuggaaminen muuttuu hankalammaksi, mutta testit toimivat nopeasti. Testejä debugatessa best practice lienee sivun html-koodin tulostaminen konsoliin.
Tapa 2: chromedriverin downloadaus
Kun itse kokeilin tehtävää vuoden tauon jälkeen marraskuussa 2020 uudella koneellani törmäsin seuraavaan virheilmoitukseen
Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.chrome.driver system property; for more information, see https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver. The latest version can be downloaded from http://chromedriver.storage.googleapis.com/index.html
at com.google.common.base.Preconditions.checkState(Preconditions.java:847)
at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:125)
at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDriverService.java:35)
at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExecutable(ChromeDriverService.java:156)
at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:346)
at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(ChromeDriverService.java:91)
at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:123)
at ohtu.Tester.main(Tester.java:11)
Ongelma ratkasi täällä olevalla ohjeella (oma koneeni Mac). Ohjeista toisen pitäisi toimia TKT:n fuksikannettaville, mutta ne edellyttävät pääkäyttäjän oikeuksia
Tapa 3: geckodriver downloadaus (testattu syksyllä 2019)
Lataa ja asenna geckodriver täällä olevan ensimmäisen vastauksen mukaan
Korvaa ohjeen kohta 4. tällä:
sudo mv geckodriver /usr/local/bin/
Ota koodissa käyttöön FirefoxDriver:
import org.openqa.selenium.firefox.FirefoxDriver;
/// ...
WebDriver driver = new FirefoxDriver();
final String URL = "http://localhost:4567";
driver.get(URL);
Tapa 4: WebDriverManager
Lisää projektille riippuvuus webdrivermanager:
dependencies {
// ...
compile ("io.github.bonigarcia:webdrivermanager:1.6.2") {
exclude group: 'org.seleniumhq.selenium'
}
}
WebDriverManager pyrkii automaattisesti konfiguroimaan käytetyn selainajurin. Sitä kutsutaan ennen valitun ajurin luomista, esimerkiksi ChromeDriver:n yhteydessä:
...
import io.github.bonigarcia.wdm.ChromeDriverManager;
...
ChromeDriverManager.getInstance().setup();
driver = new ChromeDriver();
Saadakseen sen cucumber testien yhteydessä käyttöön, ajurin alustuksen voi lisätä @Before annotaatiolla varustettuun funktioon samaan tapaan kuin jUnit testeissä:
...
import io.github.bonigarcia.wdm.ChromeDriverManager;
...
@Before
public void setUp() {
ChromeDriverManager.getInstance().setup();
driver = new ChromeDriver();
}
tapa 5: firefox-driver
Kokeile käyttää FirefoxDriveria Chromen sijaan.
vaihtoehto 1 (Testattu Linuxilla)
Projektiin oletusarvoisesti määritelty Selenium 2.41.0 tukee ainoastaan Firefoxin versiota 28. Se löytyy täältä kun klikkaat omaa arkkitehtuuriasi. Pura paketti ja ota polku talteen.
vaihtoehto 2 (Testattu macOS:llä)
Päivitä tiedostossa build.gradle määritelty selenium uudempaan versioon:
project.ext {
cucumberVersion = '1.2.5'
seleniumVersion = '2.52.0'
}
ja päivitä spark-core uudempaan versioon:
dependencies {
// vaihda tästä versionumeroa
compile group: 'com.sparkjava', name: 'spark-core', version: '2.5.5'
// lisää seuraava rivi
compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
// ...
}
Selenium 2.52.0 tukee hieman uudempia Firefoxeja, esim versiota 45.8.0. Se löytyy täältä kun klikkaat omaa arkkitehtuuriasi. Pura paketti ja ota polku talteen.
molemmat vaihtoehdot jatkavat täältä
Määrittele seuraavasti:
// ...
import org.openqa.selenium.firefox.FirefoxBinary;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
public class Tester {
public static void main(String[] args) {
File pathBinary = new File("polku/jonne/purit/firefoxin/firefox.exe");
FirefoxBinary firefoxBinary = new FirefoxBinary(pathBinary);
FirefoxProfile firefoxProfile = new FirefoxProfile();
WebDriver driver = new FirefoxDriver(firefoxBinary, firefoxProfile);
}
}
Määrittele FirefoxDriver
vastaavalla tavalla testeissä.
Tapa 6
Linuxin alla ChromeDriverin kutsuma chrome-binääri saattaa oletusarvoisesti haluta käyttää käyttöliittymänsä piirtämiseen väärän alustan taustamoottoria, eikä anna erityisen auttavaista virhetulostetta konsoliin.
$ ./gradlew browse
> Task :browse
Starting ChromeDriver 86.0.4240.75 (c69c33933bfc72a159aceb4aeca939eb0087416c-refs/branch-heads/4240@{#1149}) on port XYZ
...
Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: Chrome failed to start: crashed.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/lib64/chromium-browser/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
...
Vianselvityksessä voi selvitä esim. seuraavaa:
$ /usr/lib64/chromium-browser/chrome
[1661360:1661360:1116/191311.250169:ERROR:wayland_connection.cc(72)] Failed to connect to Wayland display
[1661360:1661360:1116/191311.250227:FATAL:ozone_platform_wayland.cc(191)] Failed to initialize Wayland platform
(core dumped) /usr/lib64/chromium-browser/chrome
Selain on yrittänyt piirtää itsensä Wayland-protokollaa käyttäen, vaikka olemme X11-istunnossa!
Ongelmaa voi kiertää muokkaamalla ohjelmakoodia esimerkiksi seuraavasti
...
import org.openqa.selenium.chrome.ChromeOptions;
...
ChromeOptions options = new ChromeOptions();
options.addArguments("--ozone-platform=x11");
//WebDriver driver = new ChromeDriver();
WebDriver driver = new ChromeDriver(options);