为什么我可以用type = radio的h:selectOneRadio单击一个输入,但不能用p:selectOneRadio与Graphene/Selenium之一进行输入?

问题描述:

A h:selectOneRadio结果<input type="radio">在表中和p:selectOneRadio<input type="radio">在表中有div s约input。这两个ID都是[form id]:[selectOneRadio id]:[option number],我可以成功地用于石墨烯功能测试中的普通JSF,当访问它时使用@FindBy(id="[...]"),而PrimeFaces变体由于org.openqa.selenium.ElementNotInteractableException而失败。调查生成的HTML我看不出区别为什么我可以用type = radio的h:selectOneRadio单击一个输入,但不能用p:selectOneRadio与Graphene/Selenium之一进行输入?

<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
    <link type="text/css" rel="stylesheet" href="/34696ceb-eeaa-4b35-88dd-f3c8fc5901bf/javax.faces.resource/theme.css.xhtml?ln=primefaces-aristo"> 
    <link type="text/css" rel="stylesheet" href="/34696ceb-eeaa-4b35-88dd-f3c8fc5901bf/javax.faces.resource/primefaces.css.xhtml;jsessionid=48ca919d0b7e89661f92149ac321?ln=primefaces&amp;v=5.0"> 
    <script type="text/javascript" src="/34696ceb-eeaa-4b35-88dd-f3c8fc5901bf/javax.faces.resource/jquery/jquery.js.xhtml;jsessionid=48ca919d0b7e89661f92149ac321?ln=primefaces&amp;v=5.0"></script> 
    <script type="text/javascript" src="/34696ceb-eeaa-4b35-88dd-f3c8fc5901bf/javax.faces.resource/primefaces.js.xhtml;jsessionid=48ca919d0b7e89661f92149ac321?ln=primefaces&amp;v=5.0"></script> 
    <title>Facelet Title</title> 
</head> 

<body> 
    <form id="mainForm" name="mainForm" method="post" action="/34696ceb-eeaa-4b35-88dd-f3c8fc5901bf/index.xhtml;jsessionid=48ca919d0b7e89661f92149ac321" enctype="application/x-www-form-urlencoded"> 
    <input name="mainForm" value="mainForm" type="hidden"> 
    <table id="mainForm:mainSelectOneRadio"> 
     <tbody> 
     <tr> 
      <td> 
      <input name="mainForm:mainSelectOneRadio" id="mainForm:mainSelectOneRadio:0" value="a" type="radio"> 
      <label for="mainForm:mainSelectOneRadio:0"> a</label> 
      </td> 
      <td> 
      <input name="mainForm:mainSelectOneRadio" id="mainForm:mainSelectOneRadio:1" value="b" type="radio"> 
      <label for="mainForm:mainSelectOneRadio:1"> b</label> 
      </td> 
      <td> 
      <input name="mainForm:mainSelectOneRadio" id="mainForm:mainSelectOneRadio:2" value="c" type="radio"> 
      <label for="mainForm:mainSelectOneRadio:2"> c</label> 
      </td> 
     </tr> 
     </tbody> 
    </table> 
    <table id="mainForm:mainSelectOneRadioPrime" class="ui-selectoneradio ui-widget"> 
     <tbody> 
     <tr> 
      <td> 
      <div class="ui-radiobutton ui-widget"> 
       <div class="ui-helper-hidden-accessible"> 
       <input id="mainForm:mainSelectOneRadioPrime:0" name="mainForm:mainSelectOneRadioPrime" value="aPrime" type="radio"> 
       </div> 
       <div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default"><span class="ui-radiobutton-icon ui-icon ui-icon-blank"></span> 
       </div> 
      </div> 
      </td> 
      <td> 
      <label for="mainForm:mainSelectOneRadioPrime:0">aPrime</label> 
      </td> 
      <td> 
      <div class="ui-radiobutton ui-widget"> 
       <div class="ui-helper-hidden-accessible"> 
       <input id="mainForm:mainSelectOneRadioPrime:1" name="mainForm:mainSelectOneRadioPrime" value="bPrime" type="radio"> 
       </div> 
       <div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default"><span class="ui-radiobutton-icon ui-icon ui-icon-blank"></span> 
       </div> 
      </div> 
      </td> 
      <td> 
      <label for="mainForm:mainSelectOneRadioPrime:1">bPrime</label> 
      </td> 
      <td> 
      <div class="ui-radiobutton ui-widget"> 
       <div class="ui-helper-hidden-accessible"> 
       <input id="mainForm:mainSelectOneRadioPrime:2" name="mainForm:mainSelectOneRadioPrime" value="cPrime" type="radio"> 
       </div> 
       <div class="ui-radiobutton-box ui-widget ui-corner-all ui-state-default"><span class="ui-radiobutton-icon ui-icon ui-icon-blank"></span> 
       </div> 
      </div> 
      </td> 
      <td> 
      <label for="mainForm:mainSelectOneRadioPrime:2">cPrime</label> 
      </td> 
     </tr> 
     </tbody> 
    </table> 
    <input name="javax.faces.ViewState" id="j_id1:javax.faces.ViewState:0" value="-485558793831512050:990657069126697889" autocomplete="off" type="hidden"> 
    </form> 
</body> 

</html> 

况且我,如果我上部署似鲭水狼牙鱼4.1.2或任何其他原因ElementNotInteractableException应用。

的获取与

@RunWith(Arquillian.class) 
public class MyManagedBeanTest { 
    private static final String WEBAPP_SRC = "src/main/webapp"; 
    private final static Logger LOGGER = LoggerFactory.getLogger(MyManagedBeanTest.class); 

    @Deployment(testable = false) 
    public static Archive<?> createDeployment0() throws TransformerException, XPathExpressionException, ParserConfigurationException, SAXException, IOException { 
     WebArchive retValue = ShrinkWrap.create(WebArchive.class) 
       .add(EmptyAsset.INSTANCE, "beans.xml") 
       .addClasses(MyManagedBean.class) 
       .addAsWebInfResource(
         new StringAsset("<faces-config version=\"2.0\"/>"), 
         "faces-config.xml"); 
     Maven.configureResolver().workOffline().resolve("richtercloud:graphene-click-input-radio:war:1.0-SNAPSHOT").withoutTransitivity().asList(JavaArchive.class).forEach(dependency -> retValue.addAsLibrary(dependency)); 
     //add all webapp resources 
     retValue.merge(ShrinkWrap.create(GenericArchive.class) 
       .as(ExplodedImporter.class) 
       .importDirectory(WEBAPP_SRC) 
       .as(GenericArchive.class), "/", Filters.include(".*\\.(xhtml|css|js|png)$")); 

     ByteArrayOutputStream archiveContentOutputStream = new ByteArrayOutputStream(); 
     retValue.writeTo(archiveContentOutputStream, Formatters.VERBOSE); 
     LOGGER.info(archiveContentOutputStream.toString()); 
     return retValue; 
    } 

    @Drone 
    private WebDriver browser; 
    @ArquillianResource 
    private URL deploymentUrl; 
    @FindBy(id = "mainForm:mainSelectOneRadio:0") 
    private WebElement mainSelectOneRadioOption0; 
    @FindBy(id = "mainForm:mainSelectOneRadioPrime:0") 
    private WebElement mainSelectOneRadioPrimeOption0; 

    @Test 
    public void testAll() { 
     browser.get(deploymentUrl.toExternalForm()+"index.xhtml"); 
     LOGGER.debug(browser.getPageSource()); 
     mainSelectOneRadioOption0.click(); 
     mainSelectOneRadioPrimeOption0.click(); 
    } 
} 

的MCVE可以在https://github.com/krichter722/graphene-click-input-radio找到完成。

我正在使用PrimeFaces 6.1。

+1

确定您点击了正确的元素?有了PF ypu需要点击om与普通的jsf不同的东西,因为原来的输入被包装了... – Kukeltje

+0

只有'div'和'input's参与,只有点击'input'才有意义。 –

我认为你的定位器很好。如果我猜的话,这将是两种情况之一:

  1. 你需要等待INPUT是点击。在尝试点击它时,无法点击。

    WebDriverWait wait = new WebDriverWait(driver, 15); 
    wait.until(ExpectedConditions.elementToBeClickable(...)); 
    
  2. 封装了*总理ID的DIV

    <div class="ui-helper-hidden-accessible"> 
    

    我不知道这是否是相关的,因为我看不到的页面,但类名,我想知道元素是否最初没有隐藏。是否需要在页面上执行一些操作以显示Prime INPUT?如果是这样,代码的行动,然后一旦INPUT被暴露它将是可点击的。 Selenium设计为与用户交互页面,因此它不会对不可见的元素执行操作(单击,获取文本等)。