我正在尝试针对Angular应用程序创建Selenium测试。我希望这些测试能在我的连续集成版本中运行,因此有必要以无头模式运行它们。我正在尝试使用无头Chrome。
我创建了两个简单的Selenium测试。一个测试访问我的本地Angular应用程序,另一个测试访问Google。当我使用Chrome GUI运行它们时,它们都能完美运行,但是当我切换到无头Chrome时,Angular测试失败。
我在Angular测试中打印出页面源,并且在使用Chrome GUI时正确显示了所有HTML,但是当我切换为无头时,页面源仅显示空的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;
}
}
答案 0 :(得分:0)
该问题是由以下原因引起的:
driver.get("localhost:" + port);
我需要指定协议。我的测试用例可以使用:
driver.get("http://localhost:" + port);