2014-02-27 18 views
1

첫 번째 링크를 클릭하는 자동화 된 Google 검색을 얻으려고합니다. 지금까지 나는 성공하지 못했고 누군가가 나를 도울 수 있는지 궁금해하고있었습니다. 매번 첫 번째 링크를 클릭하는 동작이 실패하더라도 검색 결과가 채워집니다.Selenium 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'. 루비는 대소 문자를 구별합니다. – ChicagoRedSox

+1

아직 운이 없습니다. 그래도 입력 주셔서 감사합니다. 나는 이런 종류의 일을하는 법을 배우는 중이다. 나는 .click 스크립트와 몇 가지 다른 방법을 시도했지만 아무 것도하지 않았다. 누군가 '구글 인스턴스 (Google Instance)'라인을 따라 구글과 계속 진행되고있는 장면 뒤에 어떤 것이 있다는 것을 나에게 이야기했다. 나는 100 % 아니지만 그게 문제가 될 수 있을까? 그들은 구글이 자동화를 막으려한다고 말했다. – user3358673

답변

0

첫 번째로, Selenium을 배우고 있다면 먼저 Google 페이지를 사용하지 마십시오. 그들은 단순 해 보이지만 두려운 부분에서는 매우 까다 롭고 복잡합니다. 자동화 할 다른 웹 사이트를 찾으십시오. 어쨌든 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이 없으므로 index를 사용해야합니다.

그렇지 않으면 해당 속성이 textContent이고 값이 Google Translate 인 링크에 대한 모든 결과 링크를 반복 할 수 있습니다. 링크 텍스트는 실제로 Google <em>Translate</em>이므로 XPath에서 text()을 사용하면 작동하지 않을 수 있습니다.

위의 해결책이 너무 많아서 처음에는 Google 페이지를 사용하여 Selenium을 배우지 않아야한다는 것을 증명합니다. ;)

1

어떻게이 같은 CSS 선택기, 뭔가를 사용하여 첫 번째 링크를 찾는 시도에 대해 : (n 번째 자녀 이후) 괄호의 1가 첫 번째 검색 결과를 의미

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

.

또한 내가 잘못 될 수 있지만이 같은 :link_text 대신 :link, 뭔가하려고 할 수 있습니다 : 그것은 무슨 일이 일어나고있는 동안 당신이 볼 경우, 당신이 결과를로드하기 전에 실패있어 것을 알 수

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

작동하지 않습니다 ..시도해 볼 수 있습니다. –

+0

@Amey, 나는'link_text'도 생각했지만, 실제로 finders의 목록을 보면'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에서 확인할 수 있습니다. 요소를 찾으려면 언제든지이 값을 설정하십시오. 설정이 끝나면 나머지 테스트가 적용됩니다. 일반적으로 약간의 지연 및/또는 네트워크 딸꾹질을 허용하는 것이 좋습니다.

관련 문제