2017-11-04 1 views
-1

A h:selectOneRadio Ergebnisse in <input type="radio"> in einer Tabelle und in <input type="radio"> in einer Tabelle mit einigen div s um die input. Die ID für beide ist [form id]:[selectOneRadio id]:[option number], die ich erfolgreich für die Plain JSF in einem Graphen-Funktionstest verwenden kann, wenn ich darauf mit @FindBy(id="[...]") zugreife, während die PrimeFaces-Variante aufgrund org.openqa.selenium.ElementNotInteractableException fehlschlägt. Ich die generierten HTML-Untersuchung nicht sehen, den UnterschiedWarum kann ich auf eine Eingabe mit type = radio von einem h klicken: selectOneRadio, aber nicht von einem p: selectOneRadio mit Graphen/Selen?

<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> 

noch ich tun, wenn ich die Anwendung auf Payara 4.1.2 oder irgendeinem anderen Grund für die ElementNotInteractableException bereitstellen.

Der Zugriff erfolgt mit

@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(); 
    } 
} 

Die MCVE kann bei https://github.com/krichter722/graphene-click-input-radio finden.

Ich benutze PrimeFaces 6.1.

+1

Sicher klicken Sie auf die richtigen Elemente? Mit PF müssen Sie auf andere Dinge klicken als auf plain jsf, da die orginalen Eingänge eingepackt sind ... – Kukeltje

+0

Es sind nur 'div' und' input''s involviert und nur ein Klick auf 'input' macht Sinn. –

Antwort

-2

Ich denke, Ihre Locators sind in Ordnung. Wenn ich raten, wäre es eine von zwei Situationen:

  1. Sie müssen warten, bis die INPUT anklickbar zu sein. An dem Punkt, an dem Sie darauf klicken, kann nicht geklickt werden.

    WebDriverWait wait = new WebDriverWait(driver, 15); 
    wait.until(ExpectedConditions.elementToBeClickable(...)); 
    
  2. Die DIV, die die * Prime ids hüllt ist

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

    Ich weiß nicht, ob dies relevant ist, da ich die Seite nicht sehen können, aber durch den Namen der Klasse, ich bin frage mich, ob das Element zu Beginn nicht versteckt ist. Gibt es einige Maßnahmen, die auf der Seite durchgeführt werden müssen, um den Prime INPUT zu entlarven? Wenn ja, Code, dass Aktion und dann einmal die INPUT ausgesetzt ist, wird es anklickbar sein. Selenium ist so konzipiert, dass es mit der Seite interagiert, so wie ein Benutzer keine Aktionen (Klicken, Text abrufen usw.) auf einem Element ausführen würde, das nicht sichtbar ist.

Verwandte Themen