2014-02-27 134 views
1

我試圖讓一個自動化的谷歌搜索點擊第一個鏈接。到目前爲止,我還沒有成功,並想知道是否有人可以幫助我。儘管點擊第一個鏈接的操作每次都失敗,但搜索結果仍然存在。無法使用點擊鏈接硒webdriver的

require "selenium-webdriver" 

driver = Selenium::WebDriver.for :firefox 
driver.navigate.to "http://google.com" 

element = driver.find_element(:name, 'q') 
element.send_keys "translate" 
element.submit 

resultlink = driver.find_Element(:link, "Google Translate") 
resultlink.click 
+0

'find_Element' - >'find_element'。 Ruby區分大小寫 – ChicagoRedSox

+1

仍然沒有運氣。感謝您的輸入。我只是在學習如何做這種東西。我已經嘗試了幾種不同的.click腳本方式,但沒有任何內容。有人告訴我一些關於谷歌背後幕後的事情,按照「Google實例」的說法,我不是100%,但這可能是問題嗎?他們表示Google試圖阻止自動化。 – user3358673

回答

0

首先,如果你正在學習硒,不要使用任何的谷歌頁面的開始。它們看起來很簡單,但在引擎蓋下非常複雜和複雜。找到另一個網站來自動化請。無論如何,這違背了Google的用戶協議。

然後,我可以爲你提供工作的代碼。注意Google搜索結果在不同的瀏覽器中可能會有所不同,並且您還需要使用WebDriverWait進行等待。

require 'selenium-webdriver' 

driver = Selenium::WebDriver.for :firefox 
driver.navigate.to "http://google.com" 

element = driver.find_element(:name, 'q') 
element.send_keys "translate" 
element.submit 


wait = Selenium::WebDriver::Wait.new(:timeout => 10) 
wait.until { 
    driver.find_element(:css , 'h3 > a') 
} 

# click first result 
# driver.find_element(:xpath , '(.//h3/a)[1]').click 

results = driver.find_elements(:css , 'h3 > a') 
results.each { |result| 
    if result.attribute('textContent') == 'Google Translate' 
     result.click 
     break 
    end 
} 

(.//h3/a)[1]表示第一個結果。在Firefox中,搜索結果沒有唯一data-href用於識別,因此您需要使用索引。

否則,您可以通過爲它的屬性textContent等於Google Translate鏈接的所有結果鏈接循環。請注意,鏈接文本實際上是Google <em>Translate</em>,因此在XPath中使用text()可能不起作用。

如果您發現上面的解決方案是過多服用的,它證明了你不應該擺在首位使用谷歌的網頁開始學習硒。 )

1

如何您嘗試使用CSS選擇器,這樣的定位第一個鏈接:

driver.find_element(:css, "#rso li:nth-child(1) div > h3 > a").click 

,其中括號中的1(第n個孩子後),指的是第一個搜索結果。

而且我可能是錯的,但嘗試:link_text代替:link,這樣的事情:

resultlink = driver.find_element(:link_text, "Google Translate") 
resultlink.click 
+0

它不會工作..你可以試試 –

+0

@Amey,我也想過'link_text',但是如果你看一下發現者列表,它實際上和'link'一樣:http://selenium.googlecode.com/git/docs/api /rb/Selenium/WebDriver/SearchContext.html – ChicagoRedSox

+0

那麼通過CSS搜索就是答案。 :) – Amey

1

如果你看這個,而它的發生,你可能會發現,它的結果加載之前失敗。這可能是自動化最令人討厭的一個方面:計時。 在定義元素之前,我嘗試添加sleep(5),它工作正常。然而,睡覺通常是不好的,所以你應該讓硒有一點餘地找到元素,然後再決定它不存在。你通過隱含的等待來做到這一點。例如:

driver.manage.timeouts.implicit_wait = 5 #time in seconds 

這設置最大時間硒將允許一個元素加載。如果它發現它會更快,它會立即繼續。出於這個原因,它比sleep有效得多。更多信息請見documentation。在你需要找到你的元素之前,隨時設置它。一旦設置,這將適用於您的測試的其餘部分。一般來說,允許輕微延遲和/或網絡打嗝是一個好主意。

相關問題