Automate browser actions - Clicking the submit button errors - “Click succeeded but Load Failed. ..”

元气小坏坏 提交于 2020-02-05 01:23:29

问题


I'm trying to write a code that automatically logs into two websites and goes to a certain page. I use Splinter.

I only get the error with the "Mijn ING Zakelijk" website using PhantomJS as browser type.

Until a few days ago the code ran perfectly fine 20 out of 20 times. But since today I'm getting an error. Sometimes the code runs fine. Other times it does not and gives me the "Click succeeded but Load Failed.." error. Here's the full traceback:

## Attempting to login to Mijn ING Zakelijk, please wait.
- Starting the browser..
- Visiting the url..
- Filling the username form with the defined username..
- Filling the password form with the defined password..
- Clicking the submit button..
Traceback (most recent call last):
  File "/Users/###/Dropbox/Python/Test environment 2.7.3/Splinter.py", line 98, in <module>
    mijning()
  File "/Users/###/Dropbox/Python/Test environment 2.7.3/Splinter.py", line 27, in mijning
    attemptLogin(url2, username2, password2, defined_title2, website_name2, browser_type2)
  File "/Users/###/Dropbox/Python/Test environment 2.7.3/Splinter.py", line 71, in attemptLogin
    browser.find_by_css('.submit').first.click()
  File "/Users/###/Library/Python/2.7/lib/python/site-packages/splinter/driver/webdriver/__init__.py", line 344, in click
    self._element.click()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 54, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 228, in _execute
    return self._parent.execute(command, params)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 165, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 158, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: u'Error Message => \'Click succeeded but Load Failed. Status: \'fail\'\'\n caused by Request => {"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"81","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:56899","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method":"POST","post":"{\\"sessionId\\": \\"c2bbc8a0-e3d2-11e2-b7a8-f765797dc4e7\\", \\"id\\": \\":wdc:1372850513087\\"}","url":"/click","urlParsed":{"anchor":"","query":"","file":"click","directory":"/","path":"/click","relative":"/click","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/click","queryKey":{},"chunks":["click"]},"urlOriginal":"/session/c2bbc8a0-e3d2-11e2-b7a8-f765797dc4e7/element/%3Awdc%3A1372850513087/click"}' ; Screenshot: available via screen 

Process finished with exit code 1

Here's the full code:

## *** Payment Notification and Mail Tool (FPNMT) ##
from splinter import *
from Tkinter import *

def ###():

    # Define values
    browser_type1 = 'phantomjs' # 'phantomjs' or 'firefox'
    url1 = 'http://###.nl/admin'
    username1 = '###'
    password1 = '###'
    defined_title1 = 'Bestellingen'
    website_name1 = '###.nl Admin'

    attemptLogin(url1, username1, password1, defined_title1, website_name1, browser_type1)

def mijning():

    # Define values
    browser_type2 = 'phantomjs' # 'phantomjs' or 'firefox'
    url2 = 'https://mijnzakelijk.ing.nl/internetbankieren/SesamLoginServlet'
    username2 = '###'
    password2 = '###'
    defined_title2 = 'Saldo informatie'
    website_name2 = 'Mijn ING Zakelijk'

    attemptLogin(url2, username2, password2, defined_title2, website_name2, browser_type2)

# Functions #
def attemptLogin(url, username, password, defined_title, website_name, browser_type):
    print '## Attempting to login to ' + website_name + ', please wait.'

    # Start the browser
    print '- Starting the browser..'
    browser = Browser(browser_type)

    # Visit in the url
    print '- Visiting the url..'
    browser.visit(url)

    if website_name == '###.nl Admin':
        # Find the username form and fill it with the defined username
        print '- Filling the username form with the defined username..'
        browser.fill('username', username)

        # Find the password form and fill it with the defined password
        print '- Filling the password form with the defined password..'
        browser.fill('password', password)

        # Find the submit button and click
        print '- Clicking the submit button..'
        browser.click_link_by_text('Inloggen')

        # Find, click and display page with order history
        print '- Visiting the defined web page..'
        current_token = browser.url[57:97]
        url_plus_token = 'http://www.###.nl/admin/index.php?route=sale/order' + current_token
        browser.visit(url_plus_token)

    else:
        website_name == 'Mijn ING Zakelijk'
        # Find the username form and fill it with the defined username
        print '- Filling the username form with the defined username..'
        browser.find_by_id('gebruikersnaam').first.find_by_tag('input').fill(username)

        # Find the password form and fill it with the defined password
        print '- Filling the password form with the defined password..'
        browser.find_by_id('wachtwoord').first.find_by_tag('input').fill(password)

        # Find the submit button and click
        print '- Clicking the submit button..'
        browser.find_by_css('.submit').first.click()

        # Display page with transaction history
        print '- Visiting the defined web page..'
        browser.visit('https://mijnzakelijk.ing.nl/mpz/solstartpaginarekeninginfo.do')

    # Get page title after successful login
    current_title = browser.title

    # Check the title of the page to confirm successful login
    checkLogin(defined_title, current_title, website_name, browser)

def checkLogin(defined_title, current_title, website_name, browser):
    if current_title == defined_title:
        print '# Login to', website_name, 'successful.'
        print '- Quitting the browser..'
        browser.quit()

    else:
        print '# Login to', website_name, 'failed.'
        print '- Quitting the browser..'
        browser.quit()

i = 1
while i < 10:
    print i
    #***()
    mijning()
    i = i+1

Any ideas on what's causing this error and how do I solve it?

Thanks.


回答1:


It may be that there was already some active javascript or background AJAX on the page, which confused PhantomJS into thinking that button click was unsuccessful. You could try inserting wait or try to stop the browser before clicking.




回答2:


The current version of the ghostdriver source code fixes the issue (there is no longer any "Click succeeded but Load Failed" message" - see here). The thing is, that version is not yet released (as of 08/19/2013), so you need to get it and then build it yourself. That solved the problem for me (Windows 7, Python 2.7.5, Selenium 2.33). You can find the step-by-step here.

UPDATE:

PhantomJS 1.9.2 just came out and with Ghostdriver 1.0.4, which fixes the problem (check here - no more "Click succeeded but Load Failed" message). So just upgrade to PhantomJS 1.9.2 and you should be fine. No need to build anything yourself anymore.




回答3:


This is a fixed bug, but it's show in some actual pages.

A workaround:

public static void ClickAndWaitStale( this IWebElement element , DateTime limit = default(DateTime) , TimeSpan sleepBetween = default(TimeSpan) )
{
    if ( limit == default(DateTime) )
        limit = DateTime.Now.AddSeconds( 300 );
    if ( sleepBetween == default(TimeSpan ) )
        sleepBetween = TimeSpan.FromSeconds( 1 );

    try
    {
        element.Click();
    }
    catch ( System.InvalidOperationException ) // Click succeeded but Load Failed
    {
    }

    while ( DateTime.Now < limit )
    {
        try
        {
            element.GetAttribute( "id" );
            Thread.Sleep( sleepBetween );
        }
        catch ( StaleElementReferenceException )
        {
            return;
        }
    }
    throw new TimeoutException( "Timeout waiting for stale object." );
}


来源:https://stackoverflow.com/questions/17446768/automate-browser-actions-clicking-the-submit-button-errors-click-succeeded

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!