我试图通过自动Google搜索来点击第一个链接。到目前为止,我还没有成功,并想知道是否有人可以帮助我。搜索结果会填充,但每次点击第一个链接的操作都会失败。
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 :(得分:1)
如何使用CSS选择器尝试查找First链接,如下所示:
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
答案 1 :(得分:1)
如果你在发生这种情况时观察它,你可能会注意到它在结果加载之前失败了。这可能是自动化中最烦人的一个方面:时机。
我在定义元素之前尝试添加sleep(5)
并且它有效。然而,睡眠通常是不好的,所以你应该给硒留一点余地来找到元素,然后再决定它不存在。你通过隐式等待来做到这一点。例如:
driver.manage.timeouts.implicit_wait = 5 #time in seconds
这将设置selenium允许加载元素的最大时间。如果它发现得更快,它会立即继续。因此,它比sleep
更有效率。 documentation中提供了更多信息。在您需要找到元素之前的任何时候设置它。一旦设置,这将适用于您的测试的其余部分。一般来说,允许轻微延迟和/或网络打嗝是一个好主意。
答案 2 :(得分:0)
首先,如果您正在学习Selenium,请不要使用任何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()
可能不起作用。
如果您发现上述解决方案太多而无法接受,则证明您不应该首先使用Google网页开始学习Selenium。 ;)