如何使用Fluent Automation Selenium WebDriver单击没有id的按钮?

时间:2013-04-25 14:26:14

标签: selenium-webdriver fluentautomation

我正在使用包含Selenium Web驱动程序调用的FluentAutomation库,因此可以以更加行为的方式导航网站。

只要元素具有id或其他不同的属性,它就可以直接使用:

    I.Open(Site.BaseUrl);
    I.WaitUntil(() => I.Expect.Exists("#name-search"));
    I.Click("#applicationHost a");

但我需要驱动程序单击使用以下XPath表达式标识的按钮:

//div[@id='questions']/div/div/div[4]/label/span[2]
//div[@id='questions']/div/div/div[2]/label/span[2]

等。至少这是Selenium IDE记录器返回的XPath。但我似乎无法找到正确的方法来引用这些按钮。如你所见,唯一的区别是其中一个div的索引(div [4],div [2])。是否有一个通用约定来引用具有此类XPath的元素?

更新:来自页面检查器的HTML摘录。

<div class="small-12 large-10 columns large-centered" data-bind="foreach: currentQuestion.alternatives">
            <div class="valg">
                <label data-bind="attr: { for: 'radio-' + $index() }" for="radio-0">
                    <input type="radio" name="radio-question-40" data-bind="attr: { for: 'radio-' + $index() }, value: value" class="hidden" for="radio-0" value="1">
                    <span class="enighet" data-bind="text: ($index() + 1)">1</span>
                    <span class="custom radio" data-bind="click: $parent.pickAnswer, css: { checked: $data.selected }"></span>
                    <span class="enighet" data-bind="text: text">Text for option 1</span>
                </label>
            </div>

            <div class="valg">
                <label data-bind="attr: { for: 'radio-' + $index() }" for="radio-1">
                    <input type="radio" name="radio-question-40" data-bind="attr: { for: 'radio-' + $index() }, value: value" class="hidden" for="radio-1" value="2">
                    <span class="enighet" data-bind="text: ($index() + 1)">2</span>
                    <span class="custom radio" data-bind="click: $parent.pickAnswer, css: { checked: $data.selected }"></span>
                    <span class="enighet" data-bind="text: text">Text for option 2</span>
                </label>
            </div>

        </div>

2 个答案:

答案 0 :(得分:2)

所以我对XPATH的建议是:

btn 1:"//div[@class='valg'][position() = 0]/label/span[2]"

btn 2:"//div[@class='valg'][position() = 1]/label/span[2]"

或在CSS选择器中

btn 1:"div.valg:nth-child(1) label span.enighet"

btn 2:"div.valg:nth-child(2) label span.enighet"

但是我知道你实际上有比你所展示的更多的div。 告诉我发生了什么事。

答案 1 :(得分:0)

遇到同样的问题,我使用Selenium IDE为每个元素识别XPATH,然后像这样使用它:

driver.findElement(By.xpath(“// DIV [@ ID = 'thalamusboapp-218829419'] / DIV / DIV [2] / DIV [3] / DIV / DIV / DIV [2] / DIV /跨度/ span“));