Xpath无法单击按钮(Button id& value动态更改)Selenium WebDriver Java

时间:2017-07-20 14:38:17

标签: java selenium xpath selenium-webdriver selenium-firefoxdriver

<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进行简单的点击,但我不能。我没有得到任何错误,但按钮没有被点击。

Check this picture please

到目前为止,我无法点击:

WebElement button = driver.findElement(By.xpath(".//*[@id='questionform']/div[1]/div/label[1]/i"));
button.click();

已编辑:我添加了此信息,以防万一我想要了解有关我正在谈论的网页的更多详细信息。必须有一种方法可以单击该简单按钮而无需解决方法。

“我知道要付出太多的努力,但你可以去”supercareer.com“,并在评估中接受个性,看看我实际在谈论的是什么。注意:不必是真正的邮件,简单注册1次点击,没有验证你可以访问我正在谈论的问题。这是提供我的问题的100%信息的唯一方法。“

5 个答案:

答案 0 :(得分:0)

如果您不能使用ID和值 - 请使用任何其他属性。在您的情况下,数据-scv-reaction-id&#39;是个不错的选择)

//*[@data-scv-reaction-id='strongly-disagree1']

答案 1 :(得分:0)

我使用了一些技巧来保持我的xpath简洁,更加强大。

  1. 通过将..添加到xpath的末尾,可以引用比要选择的元素更深的元素。例如,我使用<i class="x" />区分点击内容,然后使用..选择父<label />

  2. 您可以在xpath中间使用//作为通配符来浏览不感兴趣的元素。

  3. 例如:By.xpath("//form[@id='questionform']//i[@class='sc-strongly-disagree']/..")

答案 2 :(得分:0)

所以让我们这样理解:

  1. 每个问题都有一个反应部分。
  2. 每个反应部分都有多个反应按钮/图标。
  3. 我遇到过这种情况,需要按以下方式处理:

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

你明白了。