我正在使用包含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>
答案 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“));