require 'watir-webdriver' # get watir gem from watir.com # get chromedriver.exe from google and put it on Path. class K5 attr_accessor :name, :password, :sleep_value, :b, :page def initialize @name = 'trane' @password = 'boogit' @sleep_value = 3 # seconds to wait for page to load @page = 1 sleep @sleep_value # Give page time to load end def login Watir::default_timeout = 700 @b = Watir::Browser.new :chrome # assumes chromedriver.exe is on the path. @b.goto 'kuro5hin.org' sleep 3 # Give page time to load, and don't stress the site. @b.text_field(:name => 'uname').when_present.set @name @b.text_field(:name => 'pass').when_present.set @password @b.button(:name => 'login').when_present.click sleep @sleep_value # Give new page time to load @b.title end def review_hidden_comments(n = 29) l = @b.link :text => 'Review Hidden Comments' puts "Can't find 'Review Hidden Comments' link." unless l.exists? l.click Watir::Wait.until {@b.body.exists?} sleep @sleep_value # Give page time to load. puts @b.title # move to search box Watir::Wait.until {@b.text_field(:name => 'string').exists?} searchbox = @b.text_field :name => 'string' searchbox.when_present.set ' ' # press tab 7 times to get to the first hidden comment, then click the link @b.send_keys "\t\t\t\t\t\t\t\n" sleep @sleep_value # select the ratings box # the name has different numbers at the end @b.select_list(:name => /rating_/).wait_until_present # TODO: put this in the identical (1..n) loop that follows. s = @b.select_list :name => 'rating_0' (1..1000).each do |i| s = @b.select_list :name => 'rating_' + i.to_s if s.exists? #puts "rating_" + i.to_s + " found." break end end s.select 'Encourage (3)' puts "comment 1 upvoted" @b.back # Now loop through the rest of the hidden comments (1..n).each do |j| Watir::Wait.until {@b.text_field(:name => 'string').exists?} searchbox = @b.text_field :name => 'string' searchbox.set ' ' tabstring = "\t\t\t\t\t\t\t" (1..j).each do |k| tabstring = tabstring + "\t\t\t\t" end @b.send_keys tabstring + "\n" sleep @sleep_value @b.select_list(:name => /rating_/).wait_until_present s = @b.select_list :name => 'rating_0' (1..1000).each do |i| s = @b.select_list :name => 'rating_' + i.to_s if s.exists? #puts "rating_" + i.to_s + " found." break end end s.select 'Encourage (3)' puts "Hidden comment ##{j+1} upvoted." @b.back end end #def grab_hidden_comments_text n=29 def grab_hidden_comments_text n=2 # for testing comments = Array.new l = @b.link :text => 'Review Hidden Comments' puts "Can't find 'Review Hidden Comments' link." unless l.exists? l.click Watir::Wait.until {@b.body.exists?} sleep @sleep_value # Give page time to load. puts @b.title # Go the page specified. puts "@page==#{@page}." (2..@page).each do |p| @b.button(:name => "next").when_present.click end (1..n).each do |i| # move to search box Watir::Wait.until {@b.text_field(:name => 'string').exists?} searchbox = @b.text_field :name => 'string' searchbox.when_present.set ' ' # press tab 7 times to get to the first hidden comment, then click the link. # press tab 8 times if on page 2 or higher # press the tab 4 more times for each additional comment in the list tabstring = "\t\t\t\t\t\t\t" (1..i).each do |k| tabstring = tabstring + "\t\t\t\t" end if i == 1 then tabstring = "\t\t\t\t\t\t\t" end # pages of hidden comments 2 or higher have an extra button... if @page > 1 then tabstring = tabstring + "\t" end @b.send_keys tabstring + "\n" sleep @sleep_value # Grab the comment text. @b.div(:class=>'dynexpanded').wait_until_present comment = @b.div(:class => 'dynexpanded').text comment.sub!(/^\[new\] /m, '') comment.sub!(/\n\[.*\]$/m, '') #puts "raw comment #{i}: #{comment}" comment_links = @b.div(:class => 'dynexpanded').links comment_links.each { |l| if l.text.to_s.strip == '' then next end if l.href =~ /^javascript/ then next end #puts "l.text==#{l.text}." #if l.text =~ /^\#\d+$/ then next end #puts "l.text=#{l.text}." #comment.sub!(/#{l.text}((?!<\/a>).)*$/, "#{l.text})") # truncates the second occurrence of "#_" in the subject line comment.sub!(/#{l.text}(?!">)/, "#{l.text}") # truncates the second occurrence of "#_" in the subject line } # Collect comments comments.push comment #puts "comment #{i}: #{comment}" @b.back end # Post to diary #puts comments.inspect post_to_diary comments end def post_to_diary comments=Array.new n = comments.size #puts "\n\n\n\n\n\n\n\n\n\nIn post_to_diary. n==#{n}." if n == 0 then return "No comments to post!" end @b.link(:text => "New Diary Entry").when_present.click @b.text_field(:name => 'title').when_present.set "#{n} Hidden Comments Today!" @b.text_field(:name => 'tags').when_present.set "hidden comments" @b.textarea(:name => 'introtext').when_present.set comments[0] if n == 1 then return "Diary posted with #{n} comment." end @b.textarea(:name => 'bodytext').when_present.set comments[1..-1] @b.button(:name => 'preview').click sleep @sleep_value #@b.button(:name => 'save').when_present.click return "Diary with #{n} comments posted." end end if $0 == __FILE__ k5 = K5.new k5.login k5.review_hidden_comments k5.b.logout end