7

是否可以通过硒元素的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卧室豪华”,“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")]') 

回答

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']") 
6

您正走在正确的轨道上!

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不会在这种情况下多大帮助,因为你仍然需要使用硒的方法来得到阿霍德元素的点击。

+0

太棒了!我甚至没有想到get_attribute方法,然后搜索它。肯定会对其他项目有所帮助。谢谢! – crookedleaf

1

解决这类问题的一般答案是使用Selenium IDE。从这里,您可以手动点击网站上的按钮,并使用Selenium IDE(Firefox插件)记录您的操作。从那里你可以File> Export Test Case As ...并选择你想要的任何编码语言。

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

硒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秒之前发现元素,它将继续正常。