Getting InvokeMethodOnNull when object exists

This topic contains 8 replies, has 2 voices, and was last updated by Profile photo of 84rusty . 84rusty . 3 months ago.

  • Author
    Posts
  • #52901
    Profile photo of JFlanagan
    JFlanagan
    Participant

    Hi Scripters! I'm working with Internet Explorer automation to launch and log on to two websites. I can successfully create the IE COM objects, pass them to a "login" function, and see that the site accepts the credentials. However, afterward I would like to periodically refresh the page in order to maintain the session. When I pass the existing IE objects to my "test-loginPage" function (designed to check if we're back at the login page, and either login again else refresh the current page), I consistently get the InvokeMethodOnNull error when trying to use the object's Refresh method. If I use the ISE debugger and put a breakpoint at the beginning of the test-loginPage function, I can verify that the object has been passed to the function, that it's still an IE object, and that Get-Member indicates it has a Refresh method. What am I doing wrong?

    Here's the Gist; I'm running Windows 10.1511, so Powershell 5 interacting with IE 11.
    Note: I did change the stored logon information so that it is not valid credentials, and therefore commented out the part of the test-loginPage function that would normally be checking if we're still on the login page. I still expect the code to fill in the login fields but I expect the site in question will fail the logon attempt.

    Thanks in advance!

  • #52936
    Profile photo of 84rusty .
    84rusty .
    Participant

    What's the full error message you receive?

  • #52995
    Profile photo of JFlanagan
    JFlanagan
    Participant

    You cannot call a method on a null-valued expression.
    At C:\Users\\Desktop\Watchdesk2.ps1:103 char:13
    + $ieObjToTest.Refresh()
    + ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    Sorry, I forgot to include that the first time.

  • #53109
    Profile photo of 84rusty .
    84rusty .
    Participant

    I can't replicate the issue you're facing. The Refresh method works for me without error.

    If you:
    – comment out this line: login-website $startSite $ie
    – and also keep the switch conditions in test-logonPage commented out as you had above,

    does the fault still occur?

  • #53166
    Profile photo of JFlanagan
    JFlanagan
    Participant

    Yes, same error. Also the same if I directly call the refresh method of the $ieTS/$ieTex objects instead of passing them to the test-logonPage function.

    If I write out just the "launch website and refresh it" part, it works, as in:

    $telestaff = "https://www.telestaff.net/servlet/ServletController?device=stdbrowser&action=doBeginLogin"
    $ie = New-Object -com InternetExplorer.Application
    $ie.Navigate($telestaff)
    $ie.Visible = $true
    $texcom = "https://www.texcom.com/login.php"
    $ie2 = New-Object -com InternetExplorer.Application
    $ie2.Navigate($texcom)
    $ie2.Visible = $true
    Start-Sleep -s 60
    $ie.Refresh()
    $ie2.Refresh()
    

    Launches 2 IE windows, loads the appropriate pages, waits, and successfully refreshes both.

    BUT, running only the "start-IE" function (logon still commented out) and then calling the refresh method on the returned object fails, even if I launch only a single page. So, if I pull just this out of the script and run it, I get the error:

    $texcom = "https://www.texcom.com/login.php"
    
    Function Start-IE($startSite) 
    {
        $ie = New-Object -com InternetExplorer.Application
        $ie.Navigate($startSite)
        $ie.Visible = $true
        #wait for page to load
        while ($ie.Busy) 
        {
            start-sleep -s 1
        }
        #login-website $startSite $ie
        Return $ie
    }
    
    $ieTex = Start-IE $texcom
    Start-Sleep -s 60
    $ieTex.Refresh()
    

    ...Something about transporting the IE object out of the function? I still get what looks like the object if I ask for $ieTex after running the above code:
    PS C:\Users\jflanagan> $ieTex

    Application : System.__ComObject
    Parent : System.__ComObject
    Container :
    Document : mshtml.HTMLDocumentClass
    TopLevelContainer : True
    Type : HTML Document
    Left : 294
    Top : 0
    Width : 2511
    Height : 1445
    LocationName : Login | TexCom
    LocationURL : https://www.texcom.com/login.php
    Busy : False
    Name : Internet Explorer
    HWND : 199788
    FullName : C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE
    Path : C:\Program Files (x86)\Internet Explorer\
    Visible : True
    StatusBar : True
    StatusText :
    ToolBar : 1
    MenuBar : True
    FullScreen : False
    ReadyState : 4
    Offline : False
    Silent : False
    RegisterAsBrowser : False
    RegisterAsDropTarget : True
    TheaterMode : False
    AddressBar : True
    Resizable : True

  • #53368
    Profile photo of 84rusty .
    84rusty .
    Participant

    I've build a Windows 10 test VM for this, JFlanagan, and now get the same issue.

    I was using IE11 on Windows 8.1 and didn't get the error.

    Will have a play around with it today.

    • This reply was modified 3 months ago by Profile photo of 84rusty . 84rusty ..
  • #53371
    Profile photo of 84rusty .
    84rusty .
    Participant

    Ok,

    So simply do this:

    Change: $ieTex.Refresh()
    to: $ieTex.Application.Refresh()

    Tested this change works on a Windows 10 VM.

    • This reply was modified 3 months ago by Profile photo of 84rusty . 84rusty ..
  • #53580
    Profile photo of JFlanagan
    JFlanagan
    Participant

    Okay, that was pretty simple and it works for refreshing the page. Thanks 84rusty!

    Can you point me at an explanation of when/why I would need to use the .Application part? I'd like to learn and so far I'm failing at searching for it.

    • #53598
      Profile photo of 84rusty .
      84rusty .
      Participant

      I can't find an explanation either 🙁

      Maybe someone else can weigh in on this.

You must be logged in to reply to this topic.