【发布时间】:2020-10-21 07:14:21
【问题描述】:
我需要一些帮助来确定选择了哪个单选选项。我正在处理的网页有两个单选选项是和否。下面是选择是选项时的 HTML 代码。请注意,::after 填充在它的 label for 标记中。
<div class="rule-scope-radio-list">
<label class="vdl-radio">
<input id="radio_HlzYBaCpA3xEjRkH0fgU-" type="radio" class="vdl-radio__input" tabindex="0" aria-disabled="false" value="true">
<label for="radio_HlzYBaCpA3xEjRkH0fgU-">
::before
"Yes"
::after
</label>
</label>
<label class="vdl-radio">
<input id="radio_KHhle2RxBSrl5Vb_n7Eit" type="radio" class="vdl-radio__input" tabindex="0" aria-disabled="false" value="false">
<label for="radio_KHhle2RxBSrl5Vb_n7Eit">
::before
"No"
</label>
</label>
</div>
当在网页上选择“否”选项时,HTML 代码中只有 ::after 的内容会从“是”选项中删除,并填充为“否”选项。
我尝试了 Selenium 的 isSelected() 方法,但当我期待 Yes 选项为“true”时,它总是返回“false”。
作为第二种选择,我在下面编写的 Java 代码也不起作用。它正在返回null。我的想法是获取整个 input for 标签,然后使用 string.contains() 方法检查其中是否包含 ::after。因为当我在浏览器控制台上执行以下 JavaScript 时,它返回了整个 input for 标记,其中包含 ::before 和 ::after 元素。
public String yesOrNoSelected(){
String tag = "";
List<WebElement> radioOptions = findElementsByXpath(".//div[@class='rule-scope-radio-list']/label");
//Iterate thru both radio options and execute the JavaScript.
for(int i = 1; i <= radioOptions.size(); i++) {
String script = "return document.querySelector('div#rule-scope-radio-list> label:nth-of-type("+i+") label', null);";
JavascriptExecutor js = (JavascriptExecutor) driver;
tag = (String) js.executeScript(script);
System.out.println(tag);
}
return tag;
}
}
【问题讨论】:
-
尽量避免使用 CSS
::before和::after,除非您关心样式表。 -
@DebanjanB - UI 框架的设计方式就是以这种方式构建元素/属性。非常感谢任何可行的解决方案。
标签: selenium selenium-webdriver css-selectors pseudo-element