是否可以通过onclick
元素的部分值通过selenium单击元素?
页面上有多个输入项,我只需要选择一个具有特定字符串的输入项。
例子如下:
<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')">
如果您注意到最后,有“一卧室豪华”,“两卧室豪华”和“一卧室总统”。由于它是一个输入项,因此我没有任何文本可以过滤,但我只需要选择一个特定项目,例如2卧室豪华版。
在以下意义上我能做些什么:
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")]')
答案 0 :(得分:9)
XPath或CssSelector都可以。无需任何循环,但需要直截了当的定位器。
driver.find_element_by_xpath(".//input[contains(@onclick, '1 Bedroom Deluxe')]")
driver.find_element_by_css_selector("input[onclick*='1 Bedroom Deluxe']")
答案 1 :(得分:7)
你走在正确的轨道上!
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的方法来获取要点击的元素。
答案 2 :(得分:1)
解决这些问题的一般答案是使用Selenium IDE。从这里,您可以手动单击网站上的按钮,并让Selenium IDE(一个Firefox插件)记录您的操作。从那里你可以文件&gt;导出测试用例为...并选择您想要的任何编码语言。
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
编辑:有时您可能实际上找到了正确的元素,但是webdriver会尝试在它之前找到它。创建webdriver后尝试添加此行:
在Python中:
driver.implicitly_wait(10)
这告诉你的webdriver给自己更多的时间来试图找到对象。它没有增加10秒的等待,但是说继续寻找10秒钟。如果它在10秒之前找到该元素,它将继续正常。