nightwatchjs / nightwatch

Integrated end-to-end testing framework written in Node.js and using W3C Webdriver API. Developed at @browserstack
https://nightwatchjs.org
MIT License
11.8k stars 1.31k forks source link

Frames Element in Page Objects are not recognized in new version #2026

Closed tompipl closed 5 years ago

tompipl commented 5 years ago

After updating to the new version, a test using iframes is failing with the error: Error while running .switchToFrame() protocol action: no such frame The test is using a page object with this example function:

fillExpDate: function(browse, expDate) { const self = this; this.api.elements('css selector', 'iframe[title='input frame']', function(frames) { self.api .frame(null) .frame(frames.value[1]) .click('input[name=exp-date]') .setValue('input[name=exp-date]', expDate); return this; },

The test did not fail before the update.

beatfactor commented 5 years ago

Ok, but please have a look at the contributing guidelines for submitting an issue and try to include the information as detailed there.

nghhung commented 5 years ago

I got the same issue, pls help to fix it , thanks

mdz15 commented 5 years ago

I have the same problem, when trying to switch to the first frame using frame(0) this error appears Error while running .switchToFrame() protocol action: no such frame but when i try to switch to the 2nd frame using frame(1) it works as expected. I tried with chromedriver & geckodriver Here is my configuration

windows : 10, nightwatch:1.0.19, chromedriver: 2.46.0, geckodriver : 1.14.1

beatfactor commented 5 years ago

So have you ruled out the possibility that there might not be a frame 0?

On Wed, 13 Feb 2019 at 15:07, mdz15 notifications@github.com wrote:

I have the same probléme, when using trying to switch to the first frame using frame(0) this error apear Error while running .switchToFrame() protocol action: no such frame but it works when i try to switch to the 2nd frame using frame(1) I tried with chromedriver & geckodriver Here is my configuration

'"geckodriver": "^1.14.1", "nightwatch": "^1.0.19", "chromedriver": "^2.46.0"'

— You are receiving this because you commented.

Reply to this email directly, view it on GitHub https://github.com/nightwatchjs/nightwatch/issues/2026#issuecomment-463211640, or mute the thread https://github.com/notifications/unsubscribe-auth/AAZmst7mtUhE-hqdn_zJKNq5-p6-MBWCks5vNBw2gaJpZM4a3ObC .

mdz15 commented 5 years ago

@beatfactor Actually, there is a frame 0, the script I'm using was working perfectly under Nightwatch 0.9.21 but after trying to use the current version (1.0.19) , I could not change the focus to the first frame ( frame 0 )

mdz15 commented 5 years ago

@beatfactor Actually, there is a frame 0, the script I'm using was working perfectly under Nightwatch 0.9.21 but after trying to use the current version (1.0.19) , I could not change the focus to the first frame ( frame 0 )

Here is an example ( the link is inside ) :

module.exports = {
  'Demo Frames' : function (client) {
    client
    .url("https://antaki.me/frames/index.html").useXpath()
    .waitForElementVisible("//frame[@name='Header']",60000).pause(1000)
    .frame(0).waitForElementVisible('//select[@id="cmbUserGroups"]',10000)
    .click('//select[@id="cmbUserGroups"]/option[contains(text(),"Espace Collaborateur")]')
    .frame(null).pause(1000)
    .frame(1).pause(1000)
    .click('//a[@id="open-google"]')
    .end()
  }
mdz15 commented 5 years ago

Upadate : Actually targeting frame by an integer ( position ) is not working, however targeting frame using identifiers ( name ) is working

beatfactor commented 5 years ago

@mdz15 so we can close this issue then?

mdz15 commented 5 years ago

@beatfactor is there a way to change to focus to frames that doen't have a name nor an id ?, because I was using indexes with nightwatch 0.9.x and it was working fine, but in 1.0.19 it seems that it is not working

beatfactor commented 5 years ago

@mdz15 if both versions are using the same Selenium/Webdriver versions, drivers there is no reason why it shouldn't work in Nightwatch v1. So if you are in a position to explain what the difference in behaviour is Nightwatch v1 please do so and we'll fix it (you are of course encouraged to submit a PR).

deque-nathan commented 5 years ago

@beatfactor I'm working on a custom command for NightwatchJS and the thing that I need to happen is to iterate over all the iFrames in a page and select them with their Selenium ID. The only way I've been able to actually switch focus to any frames is with the id= attribute. The expected behavior is that I can use the Selenium ID to switch focus/context to the iFrame.

ptalje commented 5 years ago

I am getting the same error after upgrading to 1.0.21 while the same test case works flawless on 0.9.21, using the same Chromedriver 2.46.628402 on both setups. On Windows 7, I use NodeJS 10.14.1 while on our test server running Ubuntu 18.04 LTS we have NodeJS 8.10.0

The test case I have, where I have made an effort to be as thorough as possible during debugging, although you can get the same result with less steps.

  'iframe test': function(browser) {
    browser
      .useXpath()
      .url('https://www.quirksmode.org/iframetest.html')
      .waitForElementPresent('//body', 'Loading page')
      .waitForElementPresent('//iframe', 'Loading iframe')
      .elements('xpath', '//iframe', function(result) {
         result.value.forEach((frame) => {
           browser.elementIdAttribute(frame.ELEMENT, 'src', (attr) => {
             if (attr.value) {
               console.log('Found an iframe with src ' + attr.value);
               browser.frame({ELEMENT: frame.ELEMENT}, () => {
                  console.log('I should be navigating within iframe');
                  browser
                    .waitForElementPresent('//h1','Iframe text')
                    .getText('//h1',function(result) {
                      console.log('H1 value: ' + result.value);
                    })
                    .frameParent();
               });
             }
           });
         });
      })
    ;
  },

Nightwatch 0.9.21 test run: √ Loading page √ Loading iframe Found an iframe with src https://www.quirksmode.org/iframetest2.html I should be navigating within iframe √ Iframe text H1 value: Test page in iframe

OK. 3 assertions passed. (4.654s)

Nightwatch 1.0.19 test run: √ Loading page √ Loading iframe Found an iframe with src https://www.quirksmode.org/iframetest2.html Error while running .switchToFrame() protocol action: no such frame

I should be navigating within iframe √ Iframe text H1 value: Iframe test OK. 3 assertions passed. (405ms)

beatfactor commented 5 years ago

@ptalje could you please post the verbose log output when running in each version?

hcmec commented 5 years ago

Yeah, I found the same error. Here is a PR that should fix it https://github.com/nightwatchjs/nightwatch/pull/2040

ptalje commented 5 years ago

Here is the verbose output, the term qwerty is from a script in package.json that performs: nightwatch -t test/iframe.js. And by the way @hcmec great job submitting a PR, hopefully this will solve the problem for iframes without name/id!


Verbose output 0.9.21 C:\Development\gamlanatten>npm run qwerty --verbose

BarryKelly commented 5 years ago

Does anyone know of a fix for this yet? There is no information in my verbose relating to the issue. I am getting the same issue however it runs fine in nightwatch-cucumber. If I use the same chromedriver and selenium driver within the nightwatch-api framework the issue still persists. It would be great to find a resolution to this -

image

"devDependencies": { "cucumber": "^5.1.0", "nightwatch": "^1.0.19", "nightwatch-api": "latest", "selenium-server-standalone-jar": "^3.141.5" }

Step_def: ` return client .pause(2000)
// return client.verify.containsText('#Step3Panel .HPPContainer h2', 'Order total') .verify.containsText('#Step3Panel .HPPContainer li span', 'Total to pay:') .element('css selector', 'iframe[src*="/HPP.aspx"]', (frame) => { client.frame({ELEMENT: frame.value.ELEMENT}, () => {

                return pageObj
                    .click('#pas_ccnum')
                    .setValue('#pas_ccnum', '4123456789')
                    .setValue('#pas_expiry', '1219')
                    .setValue('#pas_cccvc', '121')
                    .setValue('#pas_ccname', '1J Doe')
                    .click('#rxp-primary-btn') 
            });
    });
});`
BarryKelly commented 5 years ago

As stated above the PR that should fixed it #2040 Thanks 👍

beatfactor commented 5 years ago

Sorry for the delay here.

@ptalje verbose log output wasn't very useful as it's the NPM log output, not the Nightwatch output.

The referenced PR #2040 also doesn't provide any details and the only meaningful change there is from String(frameId) to just frameId alone.

We cannot merge this PR if we don't have a clear understanding of the situation. So if anyone who is invested in this fix would kindly provide a relevant verbose log of the commands that are issued and also your version details, that would help a lot with moving this forward.

Otherwise it will just have to wait until we find a time to properly reproduce the issue, write some unit tests etc. And that is a bit unfortunate in my opinion, for such a trivial issue.

And if anyone does provide a verbose log, please format it properly.

ptalje commented 5 years ago

Sorry about that, hopefully this makes more sense. Unfortunately I haven't got Nightwatch 0.9.x to work on this computer yet so here's only for 1.0.19

1.0.19:

PS C:\Development\nightwatch> .\node_modules\.bin\nightwatch --verbose -t test/iframe.js
 Starting ChromeDriver on port 9515...
 ChromeDriver up and running on port 9515 with pid: 5188 (147ms).

[Iframe] Test Suite
===================
  → Running command: elements ('xpath', '//iframe', [Function])
   Request POST  /session/747475514a6555c64283232f7d3e255d/elements
   { using: 'xpath', value: '//iframe' }
   Response 200 POST /session/747475514a6555c64283232f7d3e255d/elements (11ms)
   { sessionId: '747475514a6555c64283232f7d3e255d',
     status: 0,
     value: [ { ELEMENT: '0.32240952516330057-2' } ] }
 → Completed command elements ('xpath', '//iframe', [Function]) (14ms)

 → Running command: frame ({ELEMENT, [Function])
   Request POST  /session/747475514a6555c64283232f7d3e255d/frame
   { id: '[object Object]' }
   Response 200 POST /session/747475514a6555c64283232f7d3e255d/frame (8ms)
   { sessionId: '747475514a6555c64283232f7d3e255d',
     status: 8,
     value:
      { message: 'no such frame',
        error:
         [ '  (Session info: headless chrome=72.0.3626.121)',
           '  (Driver info: chromedriver=2.46.628402 (536cd7adbad73a3783fdc2cab92ab2ba7ec361e1),platform=Windows NT 10.0.17134 x86_64)' ] } }
 Error while running .switchToFrame() protocol action: no such frame

I should be navigating within iframe
 → Completed command frame ({ELEMENT, [Function]) (12ms)
 ChromeDriver process closed.
beatfactor commented 5 years ago

@ptalje thanks, this is useful.

VasylQA commented 5 years ago

I'm receiving the same error when simply have frame(null) in page-object method or even in test

Error: Error while running .switchToFrame() protocol action: no such frame

Issue appeared after updating to 1.0.19 version from 0.9

Enough to add browser.frame(null); to test and issue will be reproduced