Chrome无头元素不可见

Gau*_*hah 1 selenium webdriver selenium-chromedriver selenium-webdriver

尝试在iframe中交互一个Editbox时遇到以下错误

请注意,如果我没有在无头模式下运行它,则代码可以正常工作。仅当我以无头模式运行时才会出现问题。

错误:

org.openqa.selenium.ElementNotVisibleException:元素不可见

堆栈跟踪:

org.openqa.selenium.ElementNotVisibleException: element not visible
  (Session info: headless chrome=60.0.3112.113)
  (Driver info: chromedriver=2.33.506092 (733a02544d189eeb751fe0d7ddca79a0ee28cce4),platform=Linux 4.9.51-10.52.amzn1.x86_64 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 21 milliseconds
Build info: version: '2.53.0', revision: '35ae25b1534ae328c771e0856c93e187490ca824', time: '2016-03-15 10:43:46'
System info: host: 'ip-172-31-41-152', ip: '172.31.41.152', os.name: 'Linux', os.arch: 'amd64', os.version: '4.9.51-10.52.amzn1.x86_64', java.version: '1.8.0_45'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.33.506092 (733a02544d189eeb751fe0d7ddca79a0ee28cce4), userDataDir=/tmp/.org.chromium.Chromium.aRCh3q}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=60.0.3112.113, platform=LINUX, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, setWindowRect=true, unexpectedAlertBehaviour=}]
Session ID: ebc4a4ce4a038d2440aedb1f4d952a64
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:327)
    at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:85)
    at com.medexpress.pages.Buyer.CheckoutPage.submitPage(CheckoutPage.java:148)
    at com.medexpress.steps.Order.Submits_the_order(Order.java:120)
    at ?.And Submits the order(com/medexpress/steps/2oder_checkout.feature:44)
Run Code Online (Sandbox Code Playgroud)

为了解决此问题,我尝试滚动到Iframe将使该iframe成为焦点的那个元素。我尝试了以下操作。但是什么也没用。它没有滚动到给定的元素。

使用本机事件滚动

actions.moveToElement(element).build().perform();
Run Code Online (Sandbox Code Playgroud)

使用JavaScript滚动

Actions actions = new Actions(driver);
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("arguments[0].scrollIntoView()", element);
Run Code Online (Sandbox Code Playgroud)

使用javascript滚动到页面末尾

js.executeScript("window.scrollTo(0,document.body.scr??ollHeight);");
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用,并给出以下错误。

org.openqa.selenium.WebDriverException:未知错误:Runtime.evaluate引发异常:SyntaxError:无效或意外令牌

请注意,以上所有代码都适用于chrome,只有无头问题可以解决。

驱动器代码

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("headless");
chromeOptions.addArguments("disable-gpu");
chromeOptions.addArguments("window-size=1200,1100");
driver = new ChromeDriver(chromeOptions);
Run Code Online (Sandbox Code Playgroud)

小智 5

如果某个元素可见(其高度和宽度大于0),则无需滚动即可单击该元素。

我遇到了同样的问题,并通过将窗口设置为FullHD来修复了它,所以只需更改此行:

chromeOptions.addArguments("window-size=1200,1100");
Run Code Online (Sandbox Code Playgroud)

chromeOptions.addArguments("window-size=1980,1080");
Run Code Online (Sandbox Code Playgroud)

自从我用C#修复Java以来​​,就不知道Java的语法,但是值得一试。