从部分值中查找并单击'onclick'项目



是否可以通过onclick元素的部分值来点击硒元素?

一个页面上有多个输入项,我只需要选择一个带有特定字符串的输入项。

例如:

<input name="booksubmit" type="button" class="searchAvailBtnSelect" value="Select" onclick="setTimeout('disableSelect()',1);bookNowSubmit('0165','1BD','000000452014022703S000016500010708F ','101400','156000','3','02/27/2014','false','false','false','false','true','false','false','EXPRESS','63','1 Bedroom Deluxe','false','AC')">
<input name="booksubmit" type="button" class="searchAvailBtnSelect" value="Select" onclick="setTimeout('disableSelect()',1);bookNowSubmit('0165','2BD','000000452014022703S000016500010708F ','101400','156000','3','02/27/2014','false','false','false','false','true','false','false','EXPRESS','63','2 Bedroom Deluxe','false','AC')">
<input name="booksubmit" type="button" class="searchAvailBtnSelect" value="Select" onclick="setTimeout('disableSelect()',1);bookNowSubmit('0165','1BD','000000452014022703S000016500010708F ','101400','156000','3','02/27/2014','false','false','false','false','true','false','false','EXPRESS','63','1 Bedroom Presidential','false','AC')">

如果你注意到最后,有一个"1卧室豪华","2卧室豪华"one_answers"1卧室总统"。由于这是一个输入项目,我无法筛选任何文本,但我只需要选择一个特定的项目,例如2 Bedroom Deluxe。

在的意义上,我能做些什么吗

buttons = driver.find_elements_by_name('booksubmit')
for button in buttons:
if button ........

什么?我目前正在使用beautifulsoup4来解析页面上的html,并检索与该项目相关的文本,所以我不知道这是否可以合并。从视觉上看,该页面是一个HTML表,其格式为:

+--------------------------------------------------------------------+
|    1 Bedroom Deluxe    |   $25   |   [button i don't care about]   |
|------------------------+---------+---------------------------------|
|    2 Bedroom Deluxe    |   $50   |   [button i'm trying to click]  |
|------------------------+---------+---------------------------------|
| 1 Bedroom Presidential |   $50   |   [button i don't care about]   |
+--------------------------------------------------------------------+

编辑:

我想发布这个太早了。紧接着,一位同事走了过来,建议通过Xpath找到元素:

driver.find_element_by_xpath('//input[contains(@onclick,"1 Bedroom Deluxe")]')

XPath或CssSelector都可以。不需要任何循环,但需要直接的定位器。

driver.find_element_by_xpath(".//input[contains(@onclick, '1 Bedroom Deluxe')]")
driver.find_element_by_css_selector("input[onclick*='1 Bedroom Deluxe']")

你走在了正确的轨道上!

buttons = driver.find_elements_by_name('booksubmit')
for button in buttons:

是的,正是这个。您希望遍历name = booksubmit元素,并检查每个元素的"onclick"属性。以下是其他部分的情况:

buttons = driver.find_elements_by_name('booksubmit')
for button in buttons:
onclick_text = button.get_attribute('onclick')
if onclick_text and re.search('Bedroom Deluxe', onclick_text):
print "found it!"
button.click()

BeautifulSoup在这种情况下没有多大帮助,因为你仍然需要使用硒的方法来获得点击的元素。

解决这类问题的一般答案是使用Selenium IDE。在这里,您可以手动点击网站上的按钮,并让SeleniumIDE(一个Firefox插件)记录您的操作。从那里你可以文件>导出测试用例为…并选择你想要的任何编码语言。

Selenium下载页面:http://docs.seleniumhq.org/download/

Selenium IDE Firefox插件2.9.0版本http://release.seleniumhq.org/selenium-ide/2.9.0/selenium-ide-2.9.0.xpi

EDIT:有时你可能真的找到了正确的元素,但网络驱动程序会在它出现之前找到它。请在创建Web驱动程序后尝试添加此行:
在Python中:
driver.implicitly_wait(10)

此命令会告诉您的Web驱动程序给自己更多的时间来尝试查找对象。它没有增加10秒的等待时间,但表示继续寻找10秒。如果它在10秒内找到元素,它将继续正常工作。

最新更新