我有一个使用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
答案 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]。
我希望这是有道理的!