【问题标题】:Unable to Identify presently the Checked/Selected radio button in a list目前无法识别列表中的选中/选定单选按钮
【发布时间】:2017-01-16 06:39:33
【问题描述】:

我有一个网页,其中包含一些问题和选项,以单选按钮的形式为问题选择。 如下图:

我一次只能选择一个单选按钮。 不过,我可以随时更改我的选择。

我想在列表中识别当前选中/选中的单选按钮。

以下是选择前的源页面html代码

<div class="ec-question-radios ng-scope">
<!-- ngRepeat: option in settings.get('options') -->
<div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
<label class="ec-question-radios__label">
<input id="ec-portfolio-planner-default-questionnaire-question21" class="ec-question-radios__input ng-pristine **ng-untouched** ng-valid ng-empty" type="radio" value="1" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question21" aria-invalid="false"/>
<span class="ec-question-radios__text ng-binding">                         It wouldn't have an impact on my standard of living and I wouldn't need to use any additional resources (for example, savings) as a result.                     </span>
</label>
</div>
<!-- end ngRepeat: option in settings.get('options') -->
<div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
<label class="ec-question-radios__label">
<input id="ec-portfolio-planner-default-questionnaire-question22" class="ec-question-radios__input ng-pristine **ng-untouched** ng-valid ng-empty" type="radio" value="2" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question22" aria-invalid="false"/>
<span class="ec-question-radios__text ng-binding">                         I have other resources I could fall back on.                     </span>
</label>
</div>

我也找到了一种解决方案,在进行任何选择后,输入选项卡中的 ng-untouched 类名称更改为 ng-touched。 但是,当我将选择从选项 1 更改为选项 2 或 3 或列表中的任何选项时,选项 1 中的类名仍然是 ng-touched。假设我将选择从选项 1 更改为 2,输入标签的类名更改为 ng-touched

如下html sn-p所示。

<div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
<label class="ec-question-radios__label">
<input id="ec-portfolio-planner-default-questionnaire-question21" class="ec-question-radios__input ng-pristine ng-valid ng-not-empty ng-touched" type="radio" value="1" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question21" aria-invalid="false"/>
<span class="ec-question-radios__text ng-binding">                         It wouldn't have an impact on my standard of living and I wouldn't need to use any additional resources (for example, savings) as a result.                     </span>
</label>
</div>
<!-- end ngRepeat: option in settings.get('options') -->
<div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
<label class="ec-question-radios__label">
<input id="ec-portfolio-planner-default-questionnaire-question22" class="ec-question-radios__input ng-pristine ng-valid ng-not-empty ng-touched" type="radio" value="2" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question22" aria-invalid="false"/>
<span class="ec-question-radios__text ng-binding">                         I have other resources I could fall back on.                     </span>
</label>
</div>
<!-- end ngRepeat: option in settings.get('options') -->
<div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
<label class="ec-question-radios__label">
<input id="ec-portfolio-planner-default-questionnaire-question23" class="ec-question-radios__input ng-pristine ng-untouched ng-valid ng-not-empty" type="radio" value="3" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question23" aria-invalid="false"/>
<span class="ec-question-radios__text ng-binding">                         It would have an impact on my immediate standard of living.                     </span>
</label>
</div>

我没有得到任何独特的方式来识别当前选择的单选按钮。 有谁能帮帮我吗?

【问题讨论】:

  • 找到了使用 JavaScript 的解决方案。感谢您的所有回答。

标签: java selenium selenium-webdriver


【解决方案1】:

您正在寻找的是isSelected,如果当前选择/选中了输入(复选框/单选按钮),它将返回True

我不确定这段代码是否完全正确,因为我不是 Java 编码器,但它可能看起来像:

for(int i=0; i<=3; i++)
    {
    if ( driver.findElements(By.xpath("//input[starts-with(@id, 'ec-portfolio-planner-default-questionnaire-question')]")).get(i).isSelected() )
        {
         WebElement selected_element = driver.findElements(By.xpath("//input[starts-with(@id, 'ec-portfolio-planner-default-questionnaire-question')]")).get(i);
        } 
    }

【讨论】:

  • 感谢您的回答,我已经尝试过使用 isSelected(),但是它不会随时让我返回 true。即使在遍历问题的可用答案列表时选择了选项/单选按钮之一。
【解决方案2】:

如果您可以为所有单选按钮使用公共属性 id 或类,那就更好了。然后首先获取所有单选按钮的列表,然后可以检查哪个单选按钮被选中或取消选中
假设您的所有单选按钮都有共同的 id = question

List<WebElement> allRadiobtn = driver.findElements(By.id("question"));
int iSize = allRadiobtn.size();
boolean bValue = false;
for(int i=0; i < iSize ; i++ ){
   bValue = allRadiobtn.get(i).isSelected();
   if(bValue == true){
           // do some action
        }
}

【讨论】:

  • 感谢您的回答,我已经尝试过使用 isSelected(),但是它不会随时让我返回 true。即使在遍历问题的可用答案列表时选择了选项/单选按钮之一。
  • @PriyaP 你能检查一下你是否可以点击 allRadiobtn.get(i).click() 的选项或尝试使用 xpath。如果仍然找不到该选项,则必须尝试其他方法
  • 当我想交叉验证时,它允许我单击/选择单选按钮,但无法从列表中返回选定的单选按钮。我想要做的是..我选择一个选项,移动到其他页面,回到我选择单选按钮选项的上一页并验证我选择的那个,仍然被选中。
  • 好的。现在我认为必须检查是否为单选按钮设置了任何隐藏值。你能在萤火虫中检查它吗
  • 是的,尝试了很多方法,甚至尝试识别单选按钮的 CSS 属性的任何变化。但还没有成功。 isSelected 和 isChecked 在我的情况下也不起作用。
【解决方案3】:
<script>
  function add_class(value_check){
  if(value_check == "1"){
    var d = document.getElementById("ec-portfolio-planner-default-questionnaire-question21");
    d.classList.add("ng-untouched");
    document.getElementById("ec-portfolio-planner-default-questionnaire-question22").classList.remove("ng-untouched");
    document.getElementById("ec-portfolio-planner-default-questionnaire-question23").classList.remove("ng-untouched");
    }
    else if(value_check == "2"){
    var d1 = document.getElementById("ec-portfolio-planner-default-questionnaire-question22");
    d1.classList.add("ng-untouched");
    document.getElementById("ec-portfolio-planner-default-questionnaire-question21").classList.remove("ng-untouched");
    document.getElementById("ec-portfolio-planner-default-questionnaire-question23").classList.remove("ng-untouched");
    }
    else if(value_check == "3"){
    var d2 = document.getElementById("ec-portfolio-planner-default-questionnaire-question23");
    d2.classList.add("ng-untouched");
    document.getElementById("ec-portfolio-planner-default-questionnaire-question21").classList.remove("ng-untouched");
    document.getElementById("ec-portfolio-planner-default-questionnaire-question22").classList.remove("ng-untouched");
    }
  }
 </script>
<div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
<label class="ec-question-radios__label">
<input id="ec-portfolio-planner-default-questionnaire-question21" class="ec-question-radios__input ng-pristine ng-valid ng-not-empty ng-touched" type="radio" value="1" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question" aria-invalid="false" onclick="add_class('1');"/>
<span class="ec-question-radios__text ng-binding">                         It wouldn't have an impact on my standard of living and I wouldn't need to use any additional resources (for example, savings) as a result.                     </span>
</label>
</div>
<!-- end ngRepeat: option in settings.get('options') -->
<div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
<label class="ec-question-radios__label">
<input id="ec-portfolio-planner-default-questionnaire-question22" class="ec-question-radios__input ng-pristine ng-valid ng-not-empty ng-touched" type="radio" value="2" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question" aria-invalid="false"  onclick="add_class('2');"/>
<span class="ec-question-radios__text ng-binding">                         I have other resources I could fall back on.                     </span>
</label>
</div>
<!-- end ngRepeat: option in settings.get('options') -->
<div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
<label class="ec-question-radios__label">
<input id="ec-portfolio-planner-default-questionnaire-question23" class="ec-question-radios__input ng-pristine ng-untouched ng-valid ng-not-empty" type="radio" value="3" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question" aria-invalid="false" onclick="add_class('3');"/>
<span class="ec-question-radios__text ng-binding">                         It would have an impact on my immediate standard of living.                     </span>
</label>
</div>

【讨论】:

    【解决方案4】:
        <script>
          function add_class(value_check){
          if(value_check == "1"){
            var d = document.getElementById("ec-portfolio-planner-default-questionnaire-question21");
            d.classList.add("ng-untouched");
            document.getElementById("ec-portfolio-planner-default-questionnaire-question22").classList.remove("ng-untouched");
            document.getElementById("ec-portfolio-planner-default-questionnaire-question23").classList.remove("ng-untouched");
            }
            else if(value_check == "2"){
            var d1 = document.getElementById("ec-portfolio-planner-default-questionnaire-question22");
            d1.classList.add("ng-untouched");
            document.getElementById("ec-portfolio-planner-default-questionnaire-question21").classList.remove("ng-untouched");
            document.getElementById("ec-portfolio-planner-default-questionnaire-question23").classList.remove("ng-untouched");
            }
            else if(value_check == "3"){
            var d2 = document.getElementById("ec-portfolio-planner-default-questionnaire-question23");
            d2.classList.add("ng-untouched");
            document.getElementById("ec-portfolio-planner-default-questionnaire-question21").classList.remove("ng-untouched");
            document.getElementById("ec-portfolio-planner-default-questionnaire-question22").classList.remove("ng-untouched");
            }
          }
         </script>
    

    function add_class(value_check){
      if(value_check == "1"){
    	var d = document.getElementById("ec-portfolio-planner-default-questionnaire-question21");
    	d.classList.add("ng-untouched");
    	document.getElementById("ec-portfolio-planner-default-questionnaire-question22").classList.remove("ng-untouched");
    	document.getElementById("ec-portfolio-planner-default-questionnaire-question23").classList.remove("ng-untouched");
    	}
    	else if(value_check == "2"){
    	var d1 = document.getElementById("ec-portfolio-planner-default-questionnaire-question22");
    	d1.classList.add("ng-untouched");
    	document.getElementById("ec-portfolio-planner-default-questionnaire-question21").classList.remove("ng-untouched");
    	document.getElementById("ec-portfolio-planner-default-questionnaire-question23").classList.remove("ng-untouched");
    	}
    	else if(value_check == "3"){
    	var d2 = document.getElementById("ec-portfolio-planner-default-questionnaire-question23");
    	d2.classList.add("ng-untouched");
    	document.getElementById("ec-portfolio-planner-default-questionnaire-question21").classList.remove("ng-untouched");
    	document.getElementById("ec-portfolio-planner-default-questionnaire-question22").classList.remove("ng-untouched");
    	}
      }
    <div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
        <label class="ec-question-radios__label">
        <input id="ec-portfolio-planner-default-questionnaire-question21" class="ec-question-radios__input ng-pristine ng-valid ng-not-empty ng-touched" type="radio" value="1" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question" aria-invalid="false" onclick="add_class('1');"/>
        <span class="ec-question-radios__text ng-binding">                         It wouldn't have an impact on my standard of living and I wouldn't need to use any additional resources (for example, savings) as a result.                     </span>
        </label>
        </div>
        <!-- end ngRepeat: option in settings.get('options') -->
        <div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
        <label class="ec-question-radios__label">
        <input id="ec-portfolio-planner-default-questionnaire-question22" class="ec-question-radios__input ng-pristine ng-valid ng-not-empty ng-touched" type="radio" value="2" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question" aria-invalid="false"  onclick="add_class('2');"/>
        <span class="ec-question-radios__text ng-binding">                         I have other resources I could fall back on.                     </span>
        </label>
        </div>
        <!-- end ngRepeat: option in settings.get('options') -->
        <div class="ec-question-radios__radio ng-scope" data-ng-click="setValue(option.id)" data-ng-repeat="option in settings.get('options')" role="button" tabindex="0">
        <label class="ec-question-radios__label">
        <input id="ec-portfolio-planner-default-questionnaire-question23" class="ec-question-radios__input ng-pristine ng-untouched ng-valid ng-not-empty" type="radio" value="3" data-ng-model="$parent.ngModel" name="ec-portfolio-planner-default-questionnaire-question" aria-invalid="false" onclick="add_class('3');"/>
        <span class="ec-question-radios__text ng-binding">                         It would have an impact on my immediate standard of living.                     </span>
        </label>
        </div>

    【讨论】:

      猜你喜欢
      • 2020-08-18
      • 2017-03-29
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 2020-10-01
      相关资源
      最近更新 更多