我试图将PHP facebook/webdriver 1.4.1和selenium 3.5的脚本放在一起,这将自动完成向我们选定的运输公司提供在线订单的任务(TNT)因为他们没有提供任何休息api来完成这个功能,而且手动每时每刻都很乏味。
除了Selectboxes之外,我的脚本工作正常,这是由一堆<ul>
和<li>
生成的jscript,我无法选择所需的值。
这是选择
的一个例子
<td>
<select id="latestCollectionTime" name="latestCollectionTime" style="display: none;">
<option value="" selected="selected">
selecteer...
</option>
<option value="2230">
22:30
</option>
<option value="2245">
22:45
</option>
<option value="2300">
23:00
</option>
<option value="2315">
23:15
</option>
<option value="2330">
23:30
</option>
<option value="2345">
23:45
</option>
</select>
<span id="latestCollectionTime-dropdown" class="selectboxit-container">
<span id="latestCollectionTimeSelectBoxIt" class="selectboxit dropdown-menu" style="" name="latestCollectionTime" tabindex="0" unselectable="on" role="combobox" aria-autocomplete="list" aria-expanded="false"
aria-owns="latestCollectionTimeSelectBoxItOptions" aria-activedescendant="0" aria-label="" aria-live="assertive">
<i id="latestCollectionTimeSelectBoxItDefaultIcon" class="selectboxit-default-icon selectboxit-option-icon" unselectable="on" style="margin-top: 5.5px;">
</i>
<span id="latestCollectionTimeSelectBoxItText" class="selectboxit-text" unselectable="on" data-val="" style="line-height: 22px; max-width: 88px;">
selecteer...
</span>
<span id="latestCollectionTimeSelectBoxItArrowContainer" class="selectboxit-arrow-container" unselectable="on" style="height: 22px;">
<i id="latestCollectionTimeSelectBoxItArrow" class="selectboxit-arrow caret" unselectable="on" style="margin-top: 7px;">
</i>
</span>
</span>
<ul id="latestCollectionTimeSelectBoxItOptions" class="selectboxit-options" tabindex="-1" role="listbox" aria-hidden="true" style="max-height: 198px; top: auto; display: none;">
<li id="0" data-val="" data-disabled="false" class="selectboxit-option selectboxit-option-first" style="" role="option">
<a class="selectboxit-option-anchor"><i class="selectboxit-option-icon " style="margin-top: 3.5px;"></i>selecteer...</a>
</li>
<li id="1" data-val="2230" data-disabled="false" class="selectboxit-option" style="" role="option">
<a class="selectboxit-option-anchor"><i class="selectboxit-option-icon " style="margin-top: 3.5px;"></i>22:30</a>
</li>
<li id="2" data-val="2245" data-disabled="false" class="selectboxit-option" style="" role="option">
<a class="selectboxit-option-anchor"><i class="selectboxit-option-icon " style="margin-top: 3.5px;"></i>22:45</a>
</li>
<li id="3" data-val="2300" data-disabled="false" class="selectboxit-option" style="" role="option">
<a class="selectboxit-option-anchor"><i class="selectboxit-option-icon " style="margin-top: 3.5px;"></i>23:00</a>
</li>
<li id="4" data-val="2315" data-disabled="false" class="selectboxit-option" style="" role="option">
<a class="selectboxit-option-anchor"><i class="selectboxit-option-icon " style="margin-top: 3.5px;"></i>23:15</a>
</li>
<li id="5" data-val="2330" data-disabled="false" class="selectboxit-option" style="" role="option">
<a class="selectboxit-option-anchor"><i class="selectboxit-option-icon " style="margin-top: 3.5px;"></i>23:30</a>
</li>
<li id="6" data-val="2345" data-disabled="false" class="selectboxit-option selectboxit-option-last" style="" role="option">
<a class="selectboxit-option-anchor"><i class="selectboxit-option-icon " style="margin-top: 3.5px;"></i>23:45</a>
</li>
</ul>
</span>
</td>
&#13;
<li>
ID是自动生成的,并在页面中的其他选择框中重复,因此我无法$driver->findElement(WebDriverBy::id('6'))->click();
。
我无法选择正常的方式。
$driver->findElement( WebDriverBy::id('latestCollectionTime') )
->findElement( WebDriverBy::cssSelector("option[value='11']") )
->click();
因为select是隐藏的style="display: none;
而不是xpath。
我希望能够直接选择data-val="2330"
这样的值,但考虑到其他3个选择框具有相同的<li>
ids和data-val值,但是具有不同的{{1} }和<span>
ids。
任何人都可以帮我吗? 提前谢谢。
修改
我完成了这样的使用:
<ul>
再次感谢@DAN在下面的回答中指出我使用xPath sintax的正确方向。
答案 0 :(得分:0)
首先,具有重复ID的元素不是有效的HTML,并且由每个浏览器决定它们将对非法页面元素执行的操作。据我所知,大多数浏览器将允许多个具有重复ID的DOM元素,但这可能在将来发生变化。
其次,您可以通过XPath选择您感兴趣的元素。例如,XPath (//*[@id = 'someID'])[1]
选择id为someID
的第一个元素。
但是,正如您提到的<ul>
元素具有不同的ID,您可以使用//ul[@id = 'latestCollectionTimeSelectBoxItOptions']/li[@data-val = '2230']
之类的XPath来选择元素。
最后,你提到列表项是不可点击的,因为它们是隐藏的,大概是因为它们是下拉菜单的一部分。
在这种情况下,您需要先点击下拉列表将其打开,然后找到并单击相应的列表项。
希望这有帮助。
答案 1 :(得分:0)
您只需点击要选择的选项。
我正在使用xpath,因为我想从给定的选择框中访问该选项。
$optionFromSelectBox = $driver->findElement(
WebDriverBy::xpath(
'//select[@id=\'latestCollectionTimeSelectBoxIt\']//option[2]'
)
);
$optionFromSelectBox->click();