如何使用Selenium Webdriver基于div的内容执行操作?

时间:2016-03-03 05:17:22

标签: ruby selenium selenium-webdriver webdriver bots

我有一个使用Selenium Webdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于与该类对应的每个div,我想根据div的内容执行一个动作。

例如,我正在解析以下页面:

https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies

这是一个搜索结果页面,我正在寻找带有" Adoption"这个词的第一个结果。在描述中。因此机器人应该查找带有className: "result"的div,对于每一个检查其.description div是否包含单词"采用",如果是,请单击{{1} } div。换句话说,如果.link不包含该字词,则机器人会转到下一个.description

这是我到目前为止所看到的,它只是点击了第一个结果:

.result

3 个答案:

答案 0 :(得分:6)

您可以获取包含"采用"的元素列表和"采用"通过XPath使用contains()然后使用union运算符(|)来结合"采用"和"采用"。请参阅以下代码:

driver = Selenium::WebDriver.for :chrome
driver.navigate.to "https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies"
sleep 5
items  = driver.find_elements(:xpath,"//div[@class='g']/div[contains(.,'Adopt')]/h3/a|//div[@class='g']/div[contains(.,'adopt')]/h3/a")
for element in items
    linkText = element.text
    print linkText
    element.click
end

答案 1 :(得分:2)

处理每次迭代的模式将取决于对每个项目执行的操作类型。如果操作是单击,则您无法列出所有链接以单击每个链接,因为第一次单击将加载新页面,使元素列表过时。 因此,如果您希望单击每个链接,那么一种方法是使用包含每次迭代链接位置的XPath:

# iteration 1
driver.find_element(:xpath, "(//h3[@class='r']/a)[1]").click   # click first link

# iteration 2
driver.find_element(:xpath, "(//h3[@class='r']/a)[2]").click   # click second link

以下是点击结果页面中每个链接的示例:

require 'selenium-webdriver'

driver = Selenium::WebDriver.for :chrome
wait = Selenium::WebDriver::Wait.new(timeout: 10000)

driver.navigate.to "https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies"

# define the xpath
search_word = "Puppies"
xpath = ("(//h3[@class='r']/a[contains(.,'%s')]" % search_word) + ")[%s]"

# iterate each result by inserting the position in the XPath
i = 0
while true do

  # wait for the results to be loaded
  wait.until {driver.find_elements(:xpath, "(//h3[@class='r']/a)[1]").any?}

  # get the next link
  link = driver.find_elements(:xpath, xpath % [i+=1]).first
  break if !link

  # click the link
  link.click

  # wait for a new page
  wait.until {driver.find_elements(:xpath, "(//h3[@class='r']/a)[1]").empty?}

  # handle the new page
  puts "Page #{i}: " + driver.title

  # return to the main page
  driver.navigate.back
end

puts "The end!"

答案 2 :(得分:1)

我不用Ruby编写代码,但是你可以在python中使用的一种方法是:

driver.find_elements

注意元素是多元的,我会抓住所有链接并将它们放入类似的数组中。

href = driver.find_elements_by_xpath("//div[@class='rc]/h3/a").getAttribute("href");

然后以相同的方式获得所有描述。为描述的每个元素执行for循环,如果描述中包含单词“Adoption”,则导航到该网站。

例如:

如果说明[6]有单词采用找到字符串href [6]并导航到href [6]。

我希望这是有道理的!