Clicking group of links in watir - ruby

I am new to ruby, and I am trying to work with watir. I think I got the basics, but I am having trouble clicking all links whose id matches a regex. I tried this;
require "watir-webdriver"
browser = Watir::Browser.new :ff
browser.goto "http://mysite.com"
browser.links(:id, /asd[0-7]/).each do |adv|
adv.click
sleep 1
end
But it doesn't seem to be clicking the links. I am doing something wrong here? Links are opening in new windows, so looping through them is no problem. But I couldn't make the loop work.

This kind of investigation is better in IRB. Anyway, you should validate that you have links to click.
require "watir-webdriver"
browser = Watir::Browser.new :ff
browser.goto "https://rvm.io/"
links = browser.links(:href => /gemsets/)
links.count
I changed mine up to use a site I can access and has links.

Related

Finding element and entering in Ruby Selenium

I'm new to the Selenium and Ruby and Cucumber/Gherkins world and am trying a simple script to navigate to the Google page, find the search bar and enter a word and press enter or find the "Google Search" element and click.
This is in a Ruby file but formatted in Gherkins as I'm working with it.
require 'rubygems'
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
Given(/^I am on the Google website$/) do
driver.navigate.to "http://www.google.com"
end
When(/^search is entered$/) do
search = driver.find_element(xpath: "//div[#class = 'jhp big']//input[#class = 'gLFyf gsfi']")
search.send_keys "this"
end
Then(/^confirm$/) do
puts "Confirmed"
driver.close
end
So here I'm navigating to the google website using a Selenium WebDriver initialized as driver. Then finding the element using the xpath and sending in the word 'this'.
When I run this, I get this error:
Selenium::WebDriver::Error::NoSuchElementError: no such element: Unable to locate element: {"method":"xpath","selector":"//div[#class = 'jhp big']//input[#class = 'gLFyf gsfi']"}
Also, to click 'enter' I can either do send_keys :enter or find the Search button and use 'click' correct?
Thank you in advance
you have to use implicit wait for driver to wait until element found
Write the following code and then fit into your cucumber model
require 'selenium-webdriver'
driver=Selenium::WebDriver.for :chrome
driver.navigate.to("https://www.google.com/")
driver.manage.timeouts.implicit_wait=10
driver.find_element(name: 'q').send_keys 'raja'
driver.find_element(name: 'btnK').click
But remember, If you WATIR which is a wrapper around selenium binding these kind of waiting is automatic.

I'm learning Ruby and using Watir to create a coupon clipping project. I'm having trouble looping through the process though

I'm trying to write a script in Ruby that will automatically clip coupons on a webpage for me. This page being:
Stop and Shop Coupons Page
What I have so far will open the browser (Firefox) and go to the coupons page on my account, but will only click one coupon and then the script closes. I've tried while loops, I've tried exists? and everything I could find online and I can't get it to clip continuously for all instances of the button '+ load to card'.
I wrote a script for the Publix website a while ago using the site:
Publix Coupon Page
and it worked just fine. To "clip" I just used:
b.buttons(:class => 'dc-clip-btn').each do |b|
b.click
sleep 2
end
I needed the "sleep" because sometimes the page would hang on the clip and the script would close. When I tried this same on the Stop & Shop page, it didn't work at all. I had to change 'button' to 'link' and ':class' to ':text' to even get it to clip one.
require 'rubygems'
require 'watir'
require 'watir-webdriver'
b = Watir::Browser.new :firefox, :profile => 'default'
b.goto 'https://stopandshop.com/dashboard/coupons-deals/#/coupons-and-deals/exclusive-coupons'
l = b.link :text => '+ load to card'
sleep 3
l.when_present.click
I've tried
l.exists?
l.click
Which will only work on one instance. I've trued the when_present as shown above. I've even used a while loop to "do" l.click. I've exhausted my resources at this point, as well as my patience. Any help is greatly appreciate. Thank you!
EDIT:
I've found that if I include :index => 1 at the end of the line
l = b.link :text => '+ load to card', :index => 1
then it will navigate to that specific spot in the array and click that link. So, I guess at this point I need help trying to get it to traverse the array and click all of those links.
EDIT 2: I was hoping to be able to post whether the suggestions worked, however I started running into an issue suddenly where when the site loads, I'm logged in as usual but then suddenly it logs me out for no reason and redirects to
https://stopandshop.com/?DPSLogout=true
EDIT 3: The Edit 2 issue was fixed. It was a permissions/cookies issue in my browser. However, none of the suggestions are working.
SOLUTION
while l.exists? do
l.click
l = b.link :text => '+ load to card', :index => 0+1
end
You should be able to iterate through the links like so:
coupons = b.links(text: '+ load to card')
coupons.each do |coupon|
coupon.click
end

Watir doesn't see element with Phantomjs

I'm trying to take a screenshot of form with this code:
require 'watir'
browser = Watir::Browser.new :phantomjs
browser.driver.manage.window.maximize
browser.goto 'https://www.binbank.ru/landing/credits/'
browser.ul(class: 'r-buttons').li(text: '6').click
sleep 2
browser.screenshot.save 'a.png'
And a.png doesn't capture form. With Firefox as browser form is seen on a.png. Why is that? How can I interact with this form with PhantomJS?
PhantomJS seems to have problems with SSL on that page. You somehow need to pass --ignore-ssl-errors=true to the underlying webdriver.
Judging by How to pass browser parameter to Watir this can be done like this:
args = %w{--ignore-ssl-errors=true}
browser = Watir::Browser.new(:phantomjs, :args => args)

Save image with watir-webdriver

How could i save image, which is loaded via watir-webdriver? All manuals and examples show only fetching src of image, and using open-uri saving it. But i need to save that image, which was generated when my page was loaded. How can i do this?
Could i use watir, and watir-webdriver at the same time? For example:
require 'watir-webdriver'
require 'watir'
#driver = Watir::Browser.new :firefox
#driver.goto (#base_url)
#img = #driver.image(id: 'CaptchaImage').save("2131.png")
How can i do something like this? Or else how to get it from cache?
Could anybody help me with it?
OpenURI will help you ..
require "watir-webdriver"
require "open-uri"
b = Watir::Browser.new :chrome
b.goto "http://stackoverflow.com/"
File.open("target_file.jpg", 'wb') do |f|
f.write open(b.img(:class, "sponsor-tag-img").src).read
end
Hope you are not doing anything bad.. :)
Please let me know if it helped.
require 'watir-webdriver'
And if you're doing it frequently, you can extend Watir's Image class with:
Watir::Image.class_eval do
def save path_to_new_file
#so that src can be opened without raising:
#Errno::ENOENT: No such file or directory # rb_sysopen
require 'open-uri'
open(path_to_new_file, 'wb') do |file|
file << open(src).read
end
end
end
so it can be used as follows:
browser = Watir::Browser.start 'google.com'
image = browser.img
image.save 'our_images/hi.png'
According to the watir-webdriver documentation, there is no Image#save method because it hasn't been implemented.
On the other hand, watir-classic does have a Image#save method. This is the example from the rdoc:
browser.image.save("c:/foo/bar.jpg")
This turned out to be a lil harder than it should be, but I needed to accomplish this since an image was only accessible when a valid session cookie is set. This is how I finally managed to accomplish this:
1. Install watir-extentions-element-screenshot
https://github.com/ansoni/watir-extensions-element-screenshot
You probably want to do gem install watir-extensions-element-screenshot.
2. Resize the browser window
This also works with headless phantomJS. After you initialize the browser, set the window size to something rather big to prevent a bug from happening when the image is larger than the browser window.
browser = Watir::Browser.new :phantomjs
browser.window.resize_to(1900, 1080)
3. Get the image element and screenshot it
In my case, the entire site is an image. Luckily, browser.html does show that the image is still encapsulated in an <img> tag, so we can access the image (in this example all images on the page) like so:
browser.elements( :tag_name => "img" ).each do |x|
x.screenshot("file_name.png")
end
This will save the image to file_name.png. It's not the exact same file, rather a screenshot of it. But as far as image download is concerned, this is a perfect solution for me and hopefully for others too!

How can I continuously open websites using Watir?

I have an array of url strings (i.e. "http://www.cnn.com") which I want to iterate through and open in Safari using watir.
urlArray.each do |url|
browser.goto(url)
end
will open the first page, but it never proceeds to the next pages in the array.
Any ideas on what's going on?
This worked for me, it opened both Google and Yahoo.
require "rubygems"
require "safariwatir"
urlArray = ["http://google.com", "http://yahoo.com"]
browser = Watir::Safari.new
urlArray.each do |url|
browser.goto url
end
When I added "http://www.cnn.com" to urlArray
urlArray = ["http://www.cnn.com", "http://google.com", "http://yahoo.com"]
it opened just cnn.com, so the problem is at that page.

Resources