zombie icon indicating copy to clipboard operation
zombie copied to clipboard

document.forms[].elements does not work

Open pronebird opened this issue 8 years ago • 3 comments

Hi,

Some of garbage code that I have to deal with uses:

document.forms["logon"].elements["username"]

This is essentially can be found on Steam's login page: https://store.steampowered.com/login/

Now whenever I press login button I get:

TypeError: Cannot read property 'elements' of undefined

I tried to run manual evaluation:

walker.evaluate 'console.log("Form: ", document.forms["logon"].elements["username"]);'

Which results in the same garbage error and ends my test with:

Error: the error {"uncaught":true} was thrown, throw an Error :)

My test looks as following:

  @timeout 60000

  walker = new Zombie
  storeUrl = 'https://store.steampowered.com/login/'
  storeReturnUrl = 'http://store.steampowered.com'

  walker.once 'error', (err) ->
    console.log "Walker.error:  #{err}"
    # done err

  console.log 'visit %s', storeUrl
  walker.visit storeUrl, ->
    walker.assert.success()
    walker.assert.element '#input_username'
    walker.assert.element '#input_password'
    walker.assert.element '#login_btn_signin button[type=submit]'

    walker.on 'redirect', (req, res) ->
      console.log "redirected: ", req, res

    walker.on 'submit', (url, target) ->
      console.log 'submit: %s, %s', url, target

    console.log 'Fill in login/password'
    console.log 'Press log in button'

    walker.evaluate 'console.log("Form: ", document.forms["logon"].elements["username"]);'

    console.log 'querySelector: ', (walker.document.querySelector 'form[name="logon"]').parentNode.innerHTML

    walker
      .fill '#input_username', STEAM_USERNAME
      .fill '#input_password', STEAM_PASS
      .pressButton '#login_btn_signin button[type=submit]', ->
        console.log 'Pressed login button'

        walker.assert.success()
        walker.assert.url storeReturnUrl

Stack trace from error:

TypeError: Cannot read property 'elements' of undefined
    at HTMLDocument.<anonymous> (https://store.steampowered.com/login/:script:7:30)
    at l (https://steamstore-a.akamaihd.net/public/shared/javascript/jquery-1.8.3.min.js?v=.TZ2NKhB-nliU:2:16996)
    at Object.c.fireWith [as resolveWith] (https://steamstore-a.akamaihd.net/public/shared/javascript/jquery-1.8.3.min.js?v=.TZ2NKhB-nliU:2:17783)
    at Function.v.extend.ready (https://steamstore-a.akamaihd.net/public/shared/javascript/jquery-1.8.3.min.js?v=.TZ2NKhB-nliU:2:12504)

  // removed for sanity

The script that it references works in all modern browsers:

    <script language="Javascript">
        $J( function() {
            var LoginManger = new CLoginPromptManager( 'https://store.steampowered.com/', {
                strRedirectURL: "http:\/\/store.steampowered.com\/",
                gidCaptcha: -1          } );

                        document.forms['logon'].elements['username'].focus();

                    } );
    </script>

This leads me to conclusion that underlying VM is rubbish. querySelector('form[name=XXX]) ran from node environment works fine. However document.forms["logon"] does not work. Any clues?

pronebird avatar Nov 23 '15 10:11 pronebird

I don't think that's implemented.

assaf avatar Nov 23 '15 17:11 assaf

I should probably dup it in jsdom as more related.

pronebird avatar Nov 23 '15 22:11 pronebird

Still not implemented. I worked it around by browser.window.document.forms["logon"] = browser.window.document.getElementById("logon") in similar situation

ibetin avatar Jul 03 '17 23:07 ibetin