The difference appears to be that `b.link(:text, 'Recharge')` includes hidden links, where as `driver.find_element(:link, 'Recharge')` only includes visible links.
The page includes 8 links with the matching text: <a class="mega-menu-link" data-mega-menu="recharge" href= "javascript:void(0);">Recharge</a> <a href="javascript:void(0);" data-i18n="recharge" module-id="common"> Recharge</a> <a target="_self" href="https://www.airtel.in/netbanking/payments-recharges" data-i18n="recharge" module-id="common" onclick="setCookie('headerlink','Bank WithUs> Savings Account > Manage Account > Recharge')">Recharge</a> <a target="_self" href="https://www.airtel.in/netbanking/payments-recharges" data-i18n="recharge" module-id="common" onclick="setCookie('headerlink','Bank WithUs> Wallet > Transact > Recharge')">Recharge</a> <a target="_self" href="https://www.airtel.in/netbanking/payments-recharges" data-i18n="recharge" module-id="common" onclick="setCookie('headerlink','Bank WithUs> Savings Account > Manage Account > Recharge')">Recharge</a> <a target="_self" href="https://www.airtel.in/netbanking/payments-recharges" data-i18n="recharge" module-id="common" onclick="setCookie('headerlink','Bank WithUs> Wallet > Transact > Recharge')">Recharge</a> <a onclick="setCookie('headerlink','Savings Account > Transact > Recharge')" target="_self" href="https://www.airtel.in/netbanking/payments-recharges" data-i18n="recharge" module-id="common">Recharge</a> <a onclick="setCookie('headerlink','Wallet > Transact > Recharge')" target="_self" href="https://www.airtel.in/netbanking/payments-recharges" data-i18n="recharge" module-id="common">Recharge</a> However, only the 2nd one, which is the one you want, is visible: b.links(:text, 'Recharge').map(&:visible?) #=> [false, true, false, false, false, false, false, false] You get an exception in Watir because it is clicking on the first one, which is hidden. You could simulate what Selenium is doing by adding the visible locator: b.link(text: 'Recharge', visible: true).click Justin On Tuesday, March 28, 2017 at 12:41:35 PM UTC-4, Raja gopalan wrote: > > This is the link "https://www.airtel.in/" once you entered, please click "PAY > & RECHARGE" then you will have Recharge option. > > > On Tuesday, March 28, 2017 at 9:34:08 AM UTC-7, Titus Fortner wrote: >> >> Apparently you included the link in an earlier post that I missed. It >> does look like Watir is grabbing a different, hidden element. I'll try to >> take a longer look at it tonight. >> >> Titus >> >> On Tuesday, March 28, 2017 at 11:24:16 AM UTC-5, Raja gopalan wrote: >>> >>> hi, sorry, that was not done properly, here is the html file >>> >>> <section id="mega-menu-pay-recharge" class="mega-menu-container >>> mega-menu-pay-recharge mega-menu-open"> >>> <a class="mega-menu-close close" href="javascript:void(0);"> >>> <article> >>> <div class="mega-dropdown-menu"> >>> <!-- ==== Label 2 Menu || Sub Menu for Pay and recharges ==== --> >>> <ul> >>> <li> >>> <li> >>> <li class="link-active"> >>> <a module-id="common" data-i18n="recharge" href="javascript:void(0);"> >>> Recharge</a> >>> <!-- ==== Label 3 Menu || Sub Menu for Recharge ==== --> >>> <ul> >>> </li> >>> <li> >>> </ul> >>> </div> >>> </article> >>> </section> >>> <!-- mega-menu-pay-recharge End--> >>> <!-- mega-menu-get--> >>> >>> On Monday, March 27, 2017 at 9:32:57 PM UTC-7, Titus Fortner wrote: >>>> >>>> This html doesn't have any links with text equal to "Recharge" >>>> >>>> >>>> On Monday, March 27, 2017 at 11:13:03 PM UTC-5, Raja gopalan wrote: >>>>> >>>>> Here is the Html code >>>>> >>>>> <document> >>>>> <html> >>>>> <head> >>>>> <body> >>>>> <main> >>>>> <div class="content-wrap"> >>>>> <!--Header--> >>>>> <header> >>>>> <nav id="airtelMegaMenu" class="navbar navbar-default dropdown"> >>>>> <div class="container-fluid text-right top-smal-menu"> >>>>> <div class="container-fluid large-menu"> >>>>> <!-- ==== Label 2 Menus for desktop ==== --> >>>>> <!-- mega-menu-pay-recharge --> >>>>> <section id="mega-menu-pay-recharge" class="mega-menu-container >>>>> mega-menu-pay-recharge mega-menu-open"> >>>>> <a class="mega-menu-close close" href="javascript:void(0);"> >>>>> <article> >>>>> <div class="mega-dropdown-menu"> >>>>> <!-- ==== Label 2 Menu || Sub Menu for Pay and recharges ==== --> >>>>> <ul> >>>>> <li> >>>>> <li class="link-active"> >>>>> <a module-id="common" data-i18n="pay_bill" href="javascript:void(0);"> >>>>> Pay Bill</a> >>>>> <!-- ==== Label 3 Menu || Sub Menu for Pay bill ==== --> >>>>> <ul> >>>>> </li> >>>>> <li class=""> >>>>> <li class=""> >>>>> </ul> >>>>> </div> >>>>> </article> >>>>> </section> >>>>> <!-- mega-menu-pay-recharge End--> >>>>> <!-- mega-menu-get--> >>>>> <section id="mega-menu-get" class="mega-menu-container mega-menu-get"> >>>>> <!-- mega-menu-get --> >>>>> <!-- mega-menu-BANK WITH US--> >>>>> <section id="mega-menu-bank" class="mega-menu-container mega-menu-bank >>>>> "> >>>>> <!-- mega-menu-BANK WITH US--> >>>>> <!-- ==== Label 2 Menus for desktop ==== --> >>>>> <!-- ==== Label 2 Menus for Mobile ==== --> >>>>> <!-- Mobile mega menu--> >>>>> <div id="mobile-mega-menu"> >>>>> <!-- mega-menu-Bank-mobile --> >>>>> <section id="mega-menu-pay-recharge" class="mega-menu-container >>>>> mega-menu-bank-mobile"> >>>>> <a class="mega-menu-close back visible-sm visible-xs" href=" >>>>> javascript:void(0);"> >>>>> <article> >>>>> <div class="mega-dropdown-menu"> >>>>> <ul> >>>>> <li> >>>>> <li class="link-active"> >>>>> <a module-id="common" data-i18n="savings_account" href=" >>>>> javascript:void(0);">Savings Account</a> >>>>> <ul> >>>>> </li> >>>>> <li> >>>>> </ul> >>>>> </div> >>>>> </article> >>>>> </section> >>>>> <!-- mega-menu-Bank-mobile--> >>>>> <!-- mega-menu-pay-bill-mobile --> >>>>> <section class="mega-menu-container mega-menu-pay-bill"> >>>>> <section class="mega-menu-container mega-menu-recharge"> >>>>> <!-- mega-menu-pay-bill-mobile End--> >>>>> <!-- mega-menu-Add-money --> >>>>> <section class="mega-menu-container mega-menu-add-money"> >>>>> <!-- mega-menu-Add-money End--> >>>>> <!-- mega-menu-Get for me--> >>>>> <section class="mega-menu-container mega-menu-get-for-me"> >>>>> <!-- mega-menu-Get for me End--> >>>>> <!-- mega-menu-for-home-mobile --> >>>>> <section class="mega-menu-container mega-menu-get-for-home"> >>>>> <!-- mega-menu-for-home-mobile End--> >>>>> <!-- mega-menu-exciting-offers-mobile --> >>>>> <section class="mega-menu-container mega-menu-exciting-offers"> >>>>> <!-- mega-menu-exciting-offers-mobile End--> >>>>> <!-- mega-menu-Bank with us mobile --> >>>>> <section class="mega-menu-container mega-menu-savings-account"> >>>>> <!-- mega-menu-Bank with us mobile End--> >>>>> <!-- mega-menu-money-wallet mobile --> >>>>> <section class="mega-menu-container mega-menu-money-wallet"> >>>>> <!-- mega-menu-money-wallet mobile End--> >>>>> </div> >>>>> <!--Mobile mega menu--> >>>>> <!-- ==== Label 2 Menus for Mobile End==== --> >>>>> </nav> >>>>> </header> >>>>> <div itemtype="http://schema.org/WebSite" itemscope=""> >>>>> <section class="banner padding-top-0 padding-bottom-0 airtel-app >>>>> bg-white home-banner overflow-hidden airtelwow animated"> >>>>> <div class="airtelwow animated"> >>>>> <div class="flex-container airtelwow"> >>>>> <div class="flex-container bg-white airtelwow"> >>>>> <div class="airtelwow"> >>>>> <div class="flex-container bg-white airtelwow"> >>>>> <div class="flex-container bg-white airtelwow"> >>>>> <!--footer--> >>>>> <footer> >>>>> </div> >>>>> </main> >>>>> <script async="" src=" >>>>> app/libs/edited/homepage/airtel-jqlite.js?version=1490500432236"/> >>>>> <script async="" src=" >>>>> app/libs/edited/homepage/lazyloading.js?version=1490500432236"/> >>>>> <script type="text/javascript">var _gaq = _gaq || []; >>>>> _gaq.push(['_setAccount', 'UA-35987772-1']); >>>>> _gaq.push(['_setDomainName', 'airtel.in']); >>>>> _gaq.push(['_setAllowLinker', true]); >>>>> _gaq.push(['_setAllowAnchor', true]); >>>>> _gaq.push(['_addIgnoredRef', ' >>>>> airtel.in']); _gaq.push(['_trackPageview']); (function() { >>>>> var ga = document.createElement('script'); ga.type = >>>>> 'text/javascript'; ga.async = true; >>>>> //ga.src = ('https:' == document.location.protocol ? 'https://' : >>>>> 'http://') + ' >>>>> stats.g.doubleclick.net/dc.js'; >>>>> ga.src = ('app/libs/edited/homepage/dc.js?version=1490500432236'); >>>>> var s = document.getElementsByTagName('script')[0]; >>>>> s.parentNode.insertBefore(ga, s); >>>>> })();</script> >>>>> <script type="text/javascript"/> >>>>> </body> >>>>> </html> >>>>> </document> >>>>> >>>>> On Monday, March 27, 2017 at 2:13:16 PM UTC-7, Titus Fortner wrote: >>>>>> >>>>>> I'd need to see the html to see why it works for one of the locator >>>>>> strategies, but not the other. >>>>>> >>>>>> On Mon, Mar 27, 2017 at 1:21 PM, Raja gopalan <[email protected]> >>>>>> wrote: >>>>>> >>>>>>> Here is the code >>>>>>> >>>>>>> >>>>>>> >>>>>>> require 'watir' >>>>>>> class AirTelRecharge >>>>>>> def initialize >>>>>>> caps = Selenium::WebDriver::Remote::Capabilities.firefox(marionette >>>>>>> : false) >>>>>>> @b=Watir::Browser.new :firefox, desired_capabilities: caps, profile >>>>>>> : "default" >>>>>>> @b.goto "https://www.airtel.in/" >>>>>>> @[email protected] >>>>>>> @driver.manage.timeouts.implicit_wait=10 >>>>>>> end >>>>>>> >>>>>>> def execute >>>>>>> @b.element(:text, 'Pay & Recharge').click >>>>>>> @driver.find_element(:link,'Recharge').click #Here is the problem >>>>>>> this code doesn't work for @b.element(:text,'Recharge').click >>>>>>> end >>>>>>> end >>>>>>> >>>>>>> AirTelRecharge.new.execute >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Monday, March 27, 2017 at 8:48:37 AM UTC-7, Titus Fortner wrote: >>>>>>>> >>>>>>>> Those two locators should find the same element, but it appears it >>>>>>>> is not if one says the element exists but is not visible and the other >>>>>>>> says >>>>>>>> it is visible. To figure out why it is finding a different element, >>>>>>>> I'd >>>>>>>> need to see the underlying html. >>>>>>>> >>>>>>>> >>>>>>>> On Sunday, March 26, 2017 at 11:38:52 PM UTC-5, Raja gopalan wrote: >>>>>>>>> >>>>>>>>> Link is clearly visible to click >>>>>>>>> >>>>>>>>> If I write >>>>>>>>> >>>>>>>>> @b.link(:text,'Recharge').click >>>>>>>>> >>>>>>>>> WATIR converts this code into >>>>>>>>> >>>>>>>>> @driver.find_element(:xpath,"//a[normalize-space()='Recharge']"). >>>>>>>>> click >>>>>>>>> >>>>>>>>> but this selenium code says that element is not visible, So it's >>>>>>>>> not working. >>>>>>>>> >>>>>>>>> If I write the following selenium code >>>>>>>>> >>>>>>>>> @driver.find_element(:link,'Recharge').click >>>>>>>>> >>>>>>>>> It works properly. >>>>>>>>> >>>>>>>>> Do you understand me now? >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Sunday, March 26, 2017 at 3:05:51 PM UTC-7, Titus Fortner wrote: >>>>>>>>>> >>>>>>>>>> Is Watir finding a different link? Or is Selenium just allowing >>>>>>>>>> the user to click a link that is not displayed? >>>>>>>>>> >>>>>>>>>> There are definitely ways that Watir can optimize its locator >>>>>>>>>> strategies, but that part of the code is not trivial to dig into. As >>>>>>>>>> always, pull requests are welcome. >>>>>>>>>> >>>>>>>>>> On Sun, Mar 26, 2017 at 12:18 PM, Raja gopalan < >>>>>>>>>> [email protected]> wrote: >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> I have written the following selenium code to click this link >>>>>>>>>>> >>>>>>>>>>> @driver.find_element(:link,'Recharge').click >>>>>>>>>>> >>>>>>>>>>> It successfully clicks the line >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> I have written the same code in WATIR as shown below >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> @b.link(:text,'Recharge').click >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> but it throws element not present error >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> I checked out how this above code works, this above code forms this >>>>>>>>>>> xpath at the end >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> "//a[normalize-space()='Recharge']" >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> So I suspected that this xpath might be the reason, So I have >>>>>>>>>>> written the below selenium code using this xpath, As I expected the >>>>>>>>>>> same >>>>>>>>>>> error was >>>>>>>>>>> >>>>>>>>>>> thrown by selenium as well(element is not visible) >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> @driver.find_element(:xpath,"//a[normalize-space()='Recharge']").click >>>>>>>>>>> >>>>>>>>>>> So what I think is, WATIR should refrain forming the xpath when >>>>>>>>>>> b.link is called, they can directly convert this code to >>>>>>>>>>> @driver.find_element(:link,'Recharge') but they >>>>>>>>>>> >>>>>>>>>>> can form the xpath when b.element(:text,'Recharge') is called >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> any suggestion? >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> -- >>>>>>>>>>> Before posting, please read http://watir.com/support. In short: >>>>>>>>>>> search before you ask, be nice. >>>>>>>>>>> >>>>>>>>>>> [email protected] >>>>>>>>>>> http://groups.google.com/group/watir-general >>>>>>>>>>> [email protected] >>>>>>>>>>> >>>>>>>>>>> --- >>>>>>>>>>> You received this message because you are subscribed to the >>>>>>>>>>> Google Groups "Watir General" group. >>>>>>>>>>> To unsubscribe from this group and stop receiving emails from >>>>>>>>>>> it, send an email to [email protected]. >>>>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>> -- >>>>>>> Before posting, please read http://watir.com/support. In short: >>>>>>> search before you ask, be nice. >>>>>>> >>>>>>> [email protected] >>>>>>> http://groups.google.com/group/watir-general >>>>>>> [email protected] >>>>>>> >>>>>>> --- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "Watir General" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to [email protected]. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> -- -- Before posting, please read http://watir.com/support. In short: search before you ask, be nice. [email protected] http://groups.google.com/group/watir-general [email protected] --- You received this message because you are subscribed to the Google Groups "Watir General" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
