【问题标题】:Unable to click link using selenium webdriver无法使用 selenium webdriver 单击链接
【发布时间】:2014-02-27 03:29:22
【问题描述】:

我正在尝试通过自动 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

【问题讨论】:

  • find_Element -> find_element。 Ruby 区分大小写
  • 还是没有运气。感谢您的输入。我只是在学习如何做这种事情。我已经尝试了 .click 脚本的几种不同方式,但什么也没有。有人告诉我一些关于谷歌在幕后发生的事情,就像“谷歌实例”一样,我不是 100%,但这可能是问题吗?他们说谷歌试图阻止自动化。

标签: ruby selenium selenium-webdriver


【解决方案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

【讨论】:

【解决方案2】:

如果您在它发生时观看它,您可能会注意到它在结果加载之前就失败了。这可能是自动化中最烦人的一个方面:时间。 我尝试在定义元素之前添加sleep(5),它起作用了。但是,睡眠通常不好,因此您应该在确定硒不存在之前给硒留出一点余地来找到该元素。你通过隐式等待来做到这一点。例如:

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

这将设置硒允许元素加载的最大时间。如果它更快找到它,它将立即继续。因此,它的效率远高于sleep。更多信息可在documentation 中找到。在您需要找到您的元素之前随时设置它。设置后,这将适用于您的剩余测试。一般来说,允许轻微的延迟和/或网络中断是一个好主意。

【讨论】:

    【解决方案3】:

    首先,如果您正在学习 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。 ;)

    【讨论】:

      猜你喜欢
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2016-09-29
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多