Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium 为什么我可以单击h:selectOneRadio的type=radio输入,而不是带有石墨烯/硒元素的p:selectOneRadio输入?_Selenium_Jsf_Primefaces_Jsf 2_Graphene2 - Fatal编程技术网

Selenium 为什么我可以单击h:selectOneRadio的type=radio输入,而不是带有石墨烯/硒元素的p:selectOneRadio输入?

Selenium 为什么我可以单击h:selectOneRadio的type=radio输入,而不是带有石墨烯/硒元素的p:selectOneRadio输入?,selenium,jsf,primefaces,jsf-2,graphene2,Selenium,Jsf,Primefaces,Jsf 2,Graphene2,Ah:selectOneRadio在表中生成,p:selectOneRadio在中生成输入周围有一些div的表中。两者的id都是[form id]:[selectOneRadio id]:[option number],当使用@FindBy(id=“[…]”)访问普通JSF时,我可以在石墨烯功能测试中成功地使用它,而PrimeFaces变量由于org.openqa.selenium.elementNotInteractiableException而失败。调查生成的HTML,我看不出有什么区别 &

A
h:selectOneRadio
在表中生成
,p:selectOneRadio在
中生成
输入周围有一些
div
的表中。两者的id都是
[form id]:[selectOneRadio id]:[option number]
,当使用
@FindBy(id=“[…]”)访问普通JSF时,我可以在石墨烯功能测试中成功地使用它,而PrimeFaces变量由于
org.openqa.selenium.elementNotInteractiableException
而失败。调查生成的HTML,我看不出有什么区别

<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>
我正在寻找一个触发JSF操作方法和AJAX侦听器的解决方案

我也对通用方法感兴趣,例如,
p:selectOneButton
products

<div id="mainForm:mainSelectOneButtonPrime" class="ui-selectonebutton ui-buttonset ui-widget ui-corner-all">
    <div class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-left">
        <input id="mainForm:mainSelectOneButtonPrime:0" name="mainForm:mainSelectOneButtonPrime" value="aPrime" class="ui-helper-hidden" type="radio">
        <span class="ui-button-text ui-c">aPrime</span>
    </div>
    <div class="ui-button ui-widget ui-state-default ui-button-text-only">
        <input id="mainForm:mainSelectOneButtonPrime:1" name="mainForm:mainSelectOneButtonPrime" value="bPrime" class="ui-helper-hidden" type="radio">
        <span class="ui-button-text ui-c">bPrime</span>
    </div>
    <div class="ui-button ui-widget ui-state-default ui-button-text-only ui-corner-right">
        <input id="mainForm:mainSelectOneButtonPrime:2" name="mainForm:mainSelectOneButtonPrime" value="cPrime" class="ui-helper-hidden" type="radio">
        <span class="ui-button-text ui-c">cPrime</span>
    </div>
</div>
<input name="javax.faces.ViewState" id="j_id1:javax.faces.ViewState:0" value="-5130093024933213812:2291815208147638618" autocomplete="off" type="hidden">

aPrime
优
cPrime
乍一看,它似乎与为
p:selectOneRadio
生成的HTML没有任何共同之处。也许有个诡计

SSCCE可在以下网址找到:


我使用的是PrimeFaces 6.1。

ui帮助程序hidden accessible
是一个布局帮助程序,用于直观地隐藏项目。您看到的单选按钮实际上是父元素,

单击单选按钮标签可以解决此问题。输入标签上的“for”属性


@盖伊有正确的答案

这里的问题是PrimeFaces在覆盖您试图单击的元素的HTML之上应用了自己的样式

Selenium检查目标元素
mainForm:mainSelectOneRadio:0
在单击顶部的元素时是否接收到事件。但在这种情况下,覆盖是使用不是目标元素的后代的同级容器完成的。因此,Selenium假定元素不会接收事件并引发
ElementNotInteractiableException
(请参阅)

通过访问并右键单击单选按钮,您可以清楚地看到问题。您将看到选定的DOM元素和
位于DOM树的两个不同分支中

要解决此问题,请单击标签,因为它没有覆盖(请参阅@Guy的解决方案)。标签具有
for
属性,这意味着所有事件都被转发到指定给
for
的元素,该元素是目标

您也可以直接单击覆盖。不过,您必须使用XPath来表示关系

目标
的父级的父级:

    @FindBy(xpath = "id('mainForm:mainSelectOneRadioPrime:2')/../..")  
    private WebElement mainSelectOneRadioPrimeOption0;
    @FindBy(xpath = "//td[.//input[@id='mainForm:mainSelectOneRadioPrime:2']]")
    private WebElement mainSelectOneRadioPrimeOption0;
或者首先具有目标的

    @FindBy(xpath = "id('mainForm:mainSelectOneRadioPrime:2')/../..")  
    private WebElement mainSelectOneRadioPrimeOption0;
    @FindBy(xpath = "//td[.//input[@id='mainForm:mainSelectOneRadioPrime:2']]")
    private WebElement mainSelectOneRadioPrimeOption0;

确定单击了正确的元素吗?使用PF ypu需要单击与普通jsf不同的东西,因为原始输入是包装的…只涉及
div
s和
input
s,只有单击
input
才有意义。您是指带有
id=“mainForm:mainSelectOneRadioPrime:0”的元素吗
?@Guy生成的HTML元素id为
mainForm:mainSelectOneRadioPrime:0
,我希望在功能测试中以编程方式单击该元素。在上面的afaik代码中,它由
main selectoneradioprimeoption0
表示。如果您考虑过提高PrimeFaces的可测试性,请毫不犹豫地在上提供帮助。这很有效,谢谢。您可以给我一个提示,告诉我如何在
p:selectOneButton
中单击由
f:selectItems
生成的选项。生成的HTML不包含标签。
s。我根据FlorentB的答案计算出来。:/code>@FindBy(xpath=“id('mainForm:mainSelectOneButtonPrime:0')/../span”)
。谢谢你的支持。我可能会给你赏金,给弗洛伦特B正确的答案。因为他的解释也帮了我很多-你的答案也是正确的,这只是关于我必须给出的分数。@KarlRichter
@FindBy(css=“[id='mainForm:mainselectonebuttontime:1']+span”)
也应该有用谢谢你的回答。这将提高我对硒的理解,超出这个问题的范围。不幸的是,没有库/扩展包装所有这些逻辑并允许执行
PrimeFacesSelectOneRadio(扩展WebElement).getSelectedOption()
。请参见对盖伊关于分数分布的回答的评论。