<form action="/assessments/1290/questions" id="questionform" method="post">
<div class="happiness-reaction__item animated fadeIn selected">
I often get upset over minor issues.
<div class="inputs">
<input id="choice_14832" value="14832" name="Answers[0].Choices" data-scv-reaction-id="strongly-disagree1" spellcheck="true" type="radio">
<label class="u" for="choice_14832">
<i class="sc-strongly-disagree"></i>
</label>
<input id="choice_14833" value="14833" name="Answers[0].Choices" data-scv-reaction-id="slightly-disagree1" spellcheck="true" type="radio">
<label class="u" for="choice_14833">
<i class="sc-slightly-disagree"></i>
</label>
<input id="choice_14834" value="14834" name="Answers[0].Choices" data-scv-reaction-id="none1" spellcheck="true" type="radio">
<label class="u" for="choice_14834">
<i class="sc-none"></i>
</label>
<input id="choice_14835" value="14835" name="Answers[0].Choices" data-scv-reaction-id="slightly-agree1" spellcheck="true" type="radio">
<label class="u" for="choice_14835">
<i class="sc-slightly-agree"></i>
</label>
<input id="choice_14836" value="14836" name="Answers[0].Choices" data-scv-reaction-id="strongly-agree1" spellcheck="true" type="radio">
<label class="u" for="choice_14836">
<i class="sc-strongly-agree"></i>
</label>
</div>
</div>
.....
我想点击那个单选按钮。自ID&amp;值等动态变化,我应该可以通过使用XPATH进行简单的点击,但我不能。我没有得到任何错误,但按钮没有被点击。
到目前为止,我无法点击:
WebElement button = driver.findElement(By.xpath(".//*[@id='questionform']/div[1]/div/label[1]/i"));
button.click();
已编辑:我添加了此信息,以防万一我想要了解有关我正在谈论的网页的更多详细信息。必须有一种方法可以单击该简单按钮而无需解决方法。
“我知道要付出太多的努力,但你可以去”supercareer.com“,并在评估中接受个性,看看我实际在谈论的是什么。注意:不必是真正的邮件,简单注册1次点击,没有验证你可以访问我正在谈论的问题。这是提供我的问题的100%信息的唯一方法。“
答案 0 :(得分:0)
如果您不能使用ID和值 - 请使用任何其他属性。在您的情况下,数据-scv-reaction-id&#39;是个不错的选择)
//*[@data-scv-reaction-id='strongly-disagree1']
答案 1 :(得分:0)
我使用了一些技巧来保持我的xpath简洁,更加强大。
通过将..
添加到xpath的末尾,可以引用比要选择的元素更深的元素。例如,我使用<i class="x" />
区分点击内容,然后使用..
选择父<label />
您可以在xpath中间使用//
作为通配符来浏览不感兴趣的元素。
例如:By.xpath("//form[@id='questionform']//i[@class='sc-strongly-disagree']/..")
答案 2 :(得分:0)
所以让我们这样理解:
我遇到过这种情况,需要按以下方式处理:
public void reactToQuestion(String question, String reaction) { // Get the question element // For eg. question = "I always complete all aspects of my work." By locQuestion = By.xpath("//*[text()='" + question + "']"); WebElement element = driver.findElement(locQuestion); // Get the parent 'div' container of the question WebElement container = element.findElement(".."); // Get reaction RELATIVELY to the question // reaction = 'strongly-disagree1', 'slightly-disagree1', etc. By locReaction = By.xpath(".//*[@class='inputs']/input[@data-scv-reaction-id=" + reaction + "]"); WebElement reaction = container.findElement(locReaction); reaction.click(); }
如果有任何问题,请尝试告诉我。
祝你好运。答案 3 :(得分:0)
在这种情况下你想要做的是找到一个&#34;容器&#34;包含您要从中选择的所有选项的元素。在这种情况下,我们可以使用问题文本来查找包含使用XPath的所有5个选项的DIV
。从那里,您可以根据I
标记的类名选择所需的选项,例如<i class="sc-strongly-agree">
。所以提供了问题文本和期望的选择,我们可以做出选择。
在这种情况下你可能会反复使用相同的代码,你通常想要创建一个函数来处理这个问题。另外,由于你反复选择5种选择中的一种,我更喜欢使用枚举。您可以使用String但是您必须处理潜在的各种输入,如果有人拼错或以某种方式打断字符串,脚本将失败。枚举使得选择所需的选择变得容易,因为IDE总是向您显示选择,使其成为一个简单的选择。如果你输入了枚举,它就不会编译......而且如果脚本失败,最好早点知道。枚举也是这些选择的容器,因此如果类名称发生更改,则更改枚举中的类名称并修复所有脚本。
功能
public static void selectChoice(String question, Choices choice)
{
driver.findElement(By.xpath("//div[contains(@class,'happiness-reaction__item')][contains(.,'" + question + "')]//i[@class='" + choice.value() + "']")).click();
}
枚举
public enum Choices
{
STRONGLYDISAGREE("sc-strongly-disagree"),
SLIGHTLYDISAGREE("sc-slightly-disagree"),
NONE("sc-none"),
SLIGHTLYAGREE("sc-slightly-agree"),
STRONGLYAGREE("sc-strongly-agree");
private String value;
Choices(String value)
{
this.value = value;
}
public String value()
{
return value;
}
}
以及你如何称呼它
selectChoice("I often get upset over minor issues.", Choices.STRONGLYAGREE);
答案 4 :(得分:0)
作为一般的xpath,来自问题的第一个输入,它可能是:
//form[@id='questionform']/div//input
如果您对某些问题需要input
:
//form[@id='questionform']/div[contains(@class, 'happiness-reaction')]//input
如果您对某个问题需要某些答案,那么:
//form[@id='questionform']/div[contains(@class, 'happiness-reaction')]//input[@data-scv-reaction-id='strongly-disagree1']
如果您需要为问题和/或答案添加参数:
//form[@id='questionform']/div[contains(@class, 'part_of_question_class')]//input[@data-scv-reaction-id='desired_answer_attr']
这些参数可以存储在数组/列表或您喜欢的任何形式中。
所有这些都可以在css中完成:
form#questionform>div input
form#questionform>div[class*=happiness-reaction] input
form#questionform>div[class*=happiness-reaction] input[data-scv-reaction-id='strongly-disagree1']
你明白了。