Выполните тесты Selenium против использования Angular в безголовом Chrome - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь создать тесты Selenium для приложения Angular. Я хочу, чтобы эти тесты выполнялись в моих сборках непрерывной интеграции, что требует запуска их в автономном режиме. Я пытаюсь использовать Chrome без головы.

Я создал два простых теста Selenium. Один тест обращается к моему локальному приложению Angular, другой - к Google. Они оба работают отлично, когда я запускаю их с помощью Chrome GUI, но тест Angular не проходит, когда я переключаюсь на Chrome без головы.

Я печатаю исходный код страницы в тесте Angular, и весь HTML-код корректно отображается при использовании Chrome GUI, но при переключении на безголовый источник страницы показывает только пустые теги head и body.

Почему это происходит и как я могу это исправить?

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ExampleSeleniumTest {

    @LocalServerPort
    private int port;

    @Autowired
    private WebDriver driver;

    @Test // Always works
    public void testGoogle() {
        driver.get("http://www.google.com");
        WebElement element = driver.findElement(By.name("q"));
        element.sendKeys("Cheese!");
        element.submit();

        List<WebElement> findElements = driver.findElements(By.xpath("//*[@id='rso']//h3/a"));

        for (WebElement webElement : findElements) {
            System.out.println(webElement.getAttribute("href"));
        }
        Assert.assertTrue(findElements.size > 0);
    }


    @Test // Breaks in headless mode
    public void testLocalAngular() {
        driver.get("localhost:" + port);
        String pageSource = driver.getPageSource();
        // Page source empty in headless mode
        System.out.println(pageSource);
        String title = driver.findElement(By.className("mat-card-title")).getText();
        Assert.assertEquals("My Starter", title);
    }
} 

Эти тесты зависят от следующей конфигурации

@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@ComponentScan(basePackageClasses = MyStarterApplication.class)
public class SeleniumConfig {

    @Value("${selenium.headless:#{true}}")
    private boolean headless;   

    @EventListener(classes = ApplicationReadyEvent.class)
    public void prepareDriver() {
        // Using https://github.com/bonigarcia/webdrivermanager
        ChromeDriverManager.getInstance().setup();
    }

    @Bean(destroyMethod = "quit")
    public WebDriver webDriver() {
        ChromeOptions options = new ChromeOptions();
        if (headless) {
            options.addArguments("headless");
            options.addArguments("window-size=1200x600");
        }
        WebDriver driver = new ChromeDriver(options);
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        return driver;
    }

}

1 Ответ

0 голосов
/ 05 октября 2018

Проблема была вызвана:

driver.get("localhost:" + port);

Мне нужно было указать протокол. Мой тестовый пример работает, если я использую:

driver.get("http://localhost:" + port);
...