从Facebook

时间:2017-08-17 14:57:13

标签: php selenium selenium-webdriver webdriver

我试图将PHP facebook/webdriver 1.4.1和selenium 3.5的脚本放在一起,这将自动完成向我们选定的运输公司提供在线订单的任务(TNT)因为他们没有提供任何休息api来完成这个功能,而且手动每时每刻都很乏味。

除了Selectboxes之外,我的脚本工作正常,这是由一堆<ul><li>生成的jscript,我无法选择所需的值。

这是选择

的一个例子

&#13;
&#13;
<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;
&#13;
&#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的正确方向。

2 个答案:

答案 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=\'latestCollectionTimeSe‌​lectBoxIt\']//option[2]'
    )
);

$optionFromSelectBox->click();