selenium - GOCD 管道,Selenium ChromeDriver 窗口大小未设置
问题描述
将 chrome 的窗口大小设置为最大化或 1980x1080 时,使用
ChromeOptions.addArguments("--start-maximized");
或者
driver.manage().window().setSize(new Dimension(1980,1080));
或者
ChromeOptions.addArguments("window-size=1980,1080");
或者
ChromeOptions.addArguments("--window-size=1980,1080");
Chrome 窗口设置为正确的大小,并且在从终端运行测试或从 intellij 运行单个测试用例时完美运行(所有测试通过)
但是,当我的 GOCD 管道接手工作时,一切都开始工作(测试开始正常执行)然后在日志中我看到测试中使用的窗口大小为 1044 x 788。
这会导致一个问题,因为我需要的按钮位于最右侧,并且由于屏幕的大小而超出了视野(我假设)
收到的消息是
2018-11-28 13:38:52.542 WARN 4456 --- [ main] utils.PageUtils : element not interactable
(Session info: chrome=70.0.3538.110)
(Driver info: chromedriver=2.44.609538 (b655c5a60b0b544917107a59d4153d4bf78e1b90),platform=Windows NT 10.0.17134 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
Build info: version: '3.9.1', revision: '63f7b50', time: '2018-02-07T22:25:02.294Z'
System info: host: 'DEV', ip: '192.168.1.177', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_191'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.44.609538 (b655c5a60b0b54..., userDataDir: C:\windows\TEMP\scoped_dir1...}, cssSelectorsEnabled: true, databaseEnabled: false, goog:chromeOptions: {debuggerAddress: localhost:62401}, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, unexpectedAlertBehaviour: ignore, unhandledPromptBehavior: ignore, version: 70.0.3538.110, webStorageEnabled: true}
Session ID: e3f442486d9087e190e0954c5fcc19f5: Click(btnSearchDropMenu) failed! re trying...
2018-11-28 13:38:52.549 WARN 4456 --- [ main] utils.PageUtils : Screen dimentions: (1044, 788)
2018-11-28 13:38:52.550 INFO 4456 --- [ main] utils.PageUtils : Scrolling to move 'btnSearchDropMenu' to the middle of the screen
2018-11-28 13:38:53.619 ERROR 4456 --- [ main] BaseTestFolder.BaseTest : org.openqa.selenium.ElementNotVisibleException: element not interactable
(Session info: chrome=70.0.3538.110)
(Driver info: chromedriver=2.44.609538 (b655c5a60b0b544917107a59d4153d4bf78e1b90),platform=Windows NT 10.0.17134 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
我已经尝试在不同区域中传递设置大小命令,包括在尝试单击选项将选项传递给我的Chrome选项对象之前的丢失的按钮之前,然后再将其重新订购。
我需要窗口至少为 1980x1080 但我不确定为什么在 GOCD 上运行测试时无法设置
我不知道为什么会出现这个问题。任何帮助将不胜感激
**编辑 1 **
奇怪的是我可以减小窗口大小并且这个属性会保持......
2018-11-28 15:47:02.754 INFO 19088 --- [ main] configuration.GoogleChrome : Window size: (1000, 600)
编辑 2
添加了我尝试过的另一个论点,
这也是 jenkins 的问题 - 默认为相同的窗口大小:(1044, 788)
解决方案
这个问题看起来是由两个问题引起的,
1- 从 IDE 运行 mvn clean test 时,此过程在您当前的用户下运行。但是,当由 CI 环境运行时,该进程归 CI 进程所有。所以没有相同的资源访问权限。
2 从 IDE 运行时,会弹出 chrome。从 CI 环境运行时,我假设它默认 chrome 以无头模式运行。它没有,您必须设置 --headless 参数,所以我现在可以使用的配置如下
public class GoogleChrome extends Base {
private static final Logger logger = LogManager.getLogger(GoogleChrome.class);
private String rootPath = System.getProperty("user.dir").replace("\\","/");
@Autowired
protected WebDriver driver;
public WebDriver startChromeDriver() {
logger.info("Chrome driver path : " + rootPath + "/../Tools/Drivers/chromedriver.exe");
System.setProperty("webdriver.chrome.driver", rootPath + "/../Tools/Drivers/chromedriver.exe");
Map<String, Object> prefs = new HashMap<String, Object>();
logger.info("Disabling Chrome's credentials service");
prefs.put("credentials_enable_service", false);
logger.info("Disabling Chrome's password manager");
prefs.put("password_manager_enabled", false);
final String regex = "^\\D*$";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(System.getProperty("user.name"));
boolean isHuman = matcher.matches();
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("prefs", prefs);
logger.info("Disabling Chrome's info bars");
options.addArguments("disable-infobars");
options.addArguments("--incognito");
options.addArguments("--disable-gpu");
options.addArguments("--no-sandbox");
options.addArguments("--allow-insecure-localhost");
if (isHuman){
logger.info("Chrome starting maximized - isHuman: " +isHuman + " process run by " +System.getProperty("user.name"));
options.addArguments("--start-maximized");
} else {
logger.info("Chrome starting headless - isHuman: " +isHuman + " process run by " +System.getProperty("user.name")) ;
options.addArguments("--headless");
options.addArguments("--window-size=1980,1080");
}
options.setAcceptInsecureCerts(true);
try {
logger.info("Killing Chrome browser");
Runtime.getRuntime().exec("taskkill /F /IM chrome.exe");
} catch (IOException e) {
logger.error("Task Kill IOException : " + e.getMessage());
}
logger.info("Starting Chrome browser...");
sleep(2);
driver = new ChromeDriver(options);
logger.info("Window size: "+ driver.manage().window().getSize());
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
return driver;
}
}
推荐阅读
- javascript - Webpack TerserPlugin 在生产中忽略 drop_console?
- html - 如何将弯曲的箭头放在对话泡泡的顶部?
- spring - 如何在多 HttpSecurity 案例中返回 http 状态码而不是登录页面
- python - 从数据框中检索一定数量的行
- sql - 如何从带有或条件和计数的sql中选择一些东西?
- kubernetes - Kafka + helm + kubernetes 集成。动态代理网址
- android-studio - 无需下载即可将谷歌字体导入Android Studio
- c# - XSD.exe 从 DLL 到 XSD
- c# - 在已经依赖注入类中再进行一次依赖注入
- rest - 是否有验证 Elasticsearch 查询参数的包?