java - Selenium Web 驱动程序无法在元素可见且可单击时单击按钮,抛出 org.openqa.selenium.ElementNotInteractableException

标签 java html scala selenium selenium-webdriver

我有以下菜单栏,我尝试使用 selenium 网络驱动程序进行测试:

<div class="text-center">
  <div class="btn-group pull-left">
    <button type="button" class="btn btn-default" id="id-home_prevButton" style="min-height:10px;min-width:10px" hidden="false"><span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span>
    </button><button type="button" class="btn btn-default" id="id-home_nextButton" style="min-height:10px;min-width:10px" hidden="false"><span class="glyphicon glyphicon-arrow-right" aria-hidden="true"></span></button>
  </div>
  <span class="span-title" id="id-home_title">Home</span>
  <div class="btn-group pull-right">
    <button type="button" class="btn btn-default" id="id-home_infoButton" hidden="false"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span></button>
    <div class="btn-group">
      <button type="button" id="id-home_dropDownButton" class="btn btn-default dropdown-toggle" data-toggle="dropdown" hidden="false">
        <i class="glyphicon glyphicon-align-justify"></i><span class="caret"></span></button>
      <ul class="dropdown-menu dropdown-menu-right simple-title-dropdown" role="menu">
        <li><a href="#home" id="id-home_menu_homeLink">Home</a></li>
      </ul>
    </div>
  </div>
</div>

按钮 ID 是唯一的。

点击按钮的 Selenium scala 代码是:

def wEPrint(description: String, wE: WebElement): String = {
  s"$description = wE.getTagName: ${wE.getTagName}  wE.getText: ${wE.getText}  wE.getSize: ${wE.getSize}  wE.isDisplayed: ${wE.isDisplayed}  wE.isEnabled: ${wE.isEnabled}  wE.isSelected: ${wE.isSelected}"
}

...


log.debug("Find id-home_prevButton")

import org.openqa.selenium.support.ui.WebDriverWait
val waitPrevButton = new WebDriverWait(driver, 20)
val prevButton = driver.findElement(By.id("id-home_prevButton"))
log.debug(wEPrint("prevButton",prevButton))
waitPrevButton.until(ExpectedConditions.visibilityOfElementLocated(By.id("id-home_prevButton")))
log.debug("id-home_prevButton.click")
prevButton.click()

sbt 控制台输出是:

22:49:11.378 [run-main-3] DEBUG com.example.selex.MWLExp$ - Find id-home_prevButton
22:49:11.539 [run-main-3] DEBUG com.example.selex.MWLExp$ - prevButton = wE.getTagName: button  wE.getText:   wE.getSize: (40, 34)  wE.isDisplayed: true  wE.isEnabled: true  wE.isSelected: false
22:49:11.588 [run-main-3] DEBUG com.example.selex.MWLExp$ - id-home_prevButton.click
[error] (run-main-3) org.openqa.selenium.ElementNotInteractableException: 
[error] Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
[error] System info: host: 'tra', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-72-generic', java.version: '1.8.0_121'
[error] Driver info: org.openqa.selenium.firefox.FirefoxDriver
[error] Capabilities [{moz:profile=/tmp/rust_mozprofile.T6j4aNCkep6a, rotatable=false, timeouts={implicit=0.0, pageLoad=300000.0, script=30000.0}, pageLoadStrategy=normal, platform=ANY, specificationLevel=0.0, moz:accessibilityChecks=false, acceptInsecureCerts=false, browserVersion=53.0, platformVersion=4.4.0-72-generic, moz:processID=51151.0, browserName=firefox, javascriptEnabled=true, platformName=linux}]
[error] Session ID: 1349d85f-d360-4725-963c-f6ec277e308c
org.openqa.selenium.ElementNotInteractableException: 
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'tra', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-72-generic', java.version: '1.8.0_121'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{moz:profile=/tmp/rust_mozprofile.T6j4aNCkep6a, rotatable=false, timeouts={implicit=0.0, pageLoad=300000.0, script=30000.0}, pageLoadStrategy=normal, platform=ANY, specificationLevel=0.0, moz:accessibilityChecks=false, acceptInsecureCerts=false, browserVersion=53.0, platformVersion=4.4.0-72-generic, moz:processID=51151.0, browserName=firefox, javascriptEnabled=true, platformName=linux}]
Session ID: 1349d85f-d360-4725-963c-f6ec277e308c
    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:423)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:150)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:115)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:45)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:164)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:637)
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:272)
    at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:82)
    at com.example.selex.MWLExp$.run01(MWLExp.scala:92)
    at simple.MainJVM$.main(DemoJVM.scala:44)
    at simple.MainJVM.main(DemoJVM.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

Selenium 测试代码可以找到按钮,显示并启用,visibilityOfElementLocated 成功但点击抛出 ElementNotInteractableException。

当我在没有 selenium 的情况下运行应用程序时,按钮是可见的,我可以单击它并且它可以正常运行。

在 selenium IDE 中单击按钮可以正常工作。单击按钮的 Selenium IDE Java 代码是:

driver.findElement(By.id("id-home_prevButton")).click();

编辑

我稍微修改了代码:

import org.openqa.selenium.support.ui.WebDriverWait
val waitPrevButton = new WebDriverWait(driver, 20)
val prevButton = driver.findElement(By.id("id-home_prevButton"))
log.debug(wEPrint("prevButton",prevButton))
waitPrevButton.until(ExpectedConditions.visibilityOfElementLocated(By.id("id-home_prevButton")))
log.debug("id-home_prevButton.click")
//prevButton.click()
//prevButton.sendKeys(Keys.RETURN)
prevButton.sendKeys(Keys.ENTER)

现在异常信息是:

23:30:56.497 [run-main-6] DEBUG com.example.selex.MWLExp$ - Find id-home_prevButton
23:30:56.735 [run-main-6] DEBUG com.example.selex.MWLExp$ - prevButton = wE.getTagName: button  wE.getText:   wE.getSize: (40, 34)  wE.isDisplayed: true  wE.isEnabled: true  wE.isSelected: false
23:30:56.798 [run-main-6] DEBUG com.example.selex.MWLExp$ - id-home_prevButton.click
[error] (run-main-6) org.openqa.selenium.ElementNotInteractableException: Element is not visible
[error] Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
[error] System info: host: 'tra', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-72-generic', java.version: '1.8.0_121'
[error] Driver info: org.openqa.selenium.firefox.FirefoxDriver
[error] Capabilities [{moz:profile=/tmp/rust_mozprofile.gBopOPHPUrCL, rotatable=false, timeouts={implicit=0.0, pageLoad=300000.0, script=30000.0}, pageLoadStrategy=normal, platform=ANY, specificationLevel=0.0, moz:accessibilityChecks=false, acceptInsecureCerts=false, browserVersion=53.0, platformVersion=4.4.0-72-generic, moz:processID=54936.0, browserName=firefox, javascriptEnabled=true, platformName=linux}]
[error] Session ID: eba7323c-6412-4ed7-a91f-3f897b3ec83f
org.openqa.selenium.ElementNotInteractableException: Element is not visible
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'tra', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-72-generic', java.version: '1.8.0_121'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{moz:profile=/tmp/rust_mozprofile.gBopOPHPUrCL, rotatable=false, timeouts={implicit=0.0, pageLoad=300000.0, script=30000.0}, pageLoadStrategy=normal, platform=ANY, specificationLevel=0.0, moz:accessibilityChecks=false, acceptInsecureCerts=false, browserVersion=53.0, platformVersion=4.4.0-72-generic, moz:processID=54936.0, browserName=firefox, javascriptEnabled=true, platformName=linux}]
Session ID: eba7323c-6412-4ed7-a91f-3f897b3ec83f
    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:423)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:150)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:115)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:45)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:164)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:637)
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:272)
    at org.openqa.selenium.remote.RemoteWebElement.sendKeys(RemoteWebElement.java:96)
    at com.example.selex.MWLExp$.run01(MWLExp.scala:93)
    at simple.MainJVM$.main(DemoJVM.scala:44)
    at simple.MainJVM.main(DemoJVM.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

所以现在它说元素不可见,尽管 visibilityOfElementLocated 已成功显示并启用。

出现此异常的原因是什么,如何解决?

感谢您的支持。

最佳答案

使用javascriptExecutor通过嵌入javascript点击元素。通过使用 javascript 执行器,我们可以在驱动程序上运行 javascript。

WebElement element = driver.findElement(By.id("id-home_prevButton");
((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);

关于java - Selenium Web 驱动程序无法在元素可见且可单击时单击按钮,抛出 org.openqa.selenium.ElementNotInteractableException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44101284/

相关文章:

java - 如何在svn中查找文件夹内的文件数

html - 如何让 CSS 工具提示在 Shiny 数据表中工作?

html - Telegram 和 FB 链接预览

java - 如何从cxf out拦截器获取 session

java - Calendar#getFirstDayOfWeek() 返回错误值

java - 为什么 -1 右移 1 = -1 在 Java 中?

html - 如何将 LaTeX Sweave 文件 (Rnw) 转换为 HTML?

scala - 如何在 Scala Actor 模型中重载 bang(!) 运算符?

postgresql - 在 Slick 中添加评论

regex - Scala 正则表达式(由双引号分隔的字符串)