1

2 つの Web サイトに自動的にログインして特定のページに移動するコードを作成しようとしています。スプリンターを使用しています。

PhantomJSをブラウザーの種類として使用している "Mijn ING Zakelijk" Web サイトでのみエラーが発生します。

数日前まで、コードは 20 回中 20 回は完全に正常に動作していました。しかし、今日からエラーが発生します。コードが正常に実行される場合もあります。それ以外の場合は、「クリックは成功しましたが、ロードに失敗しました..」というエラーが表示されます。完全なトレースバックは次のとおりです。

## 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

完全なコードは次のとおりです。

## *** 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

このエラーの原因と解決方法についてのアイデアはありますか?

ありがとう。

4

3 に答える 3

5

ゴーストドライバーのソースコードの現在のバージョンでは、この問題が修正されています (「クリックは成功しましたが、読み込みに失敗しました」というメッセージは表示されなくなりました -ここを参照してください)。 , so you need to get it and then build it yourself. これで問題は解決しました (Windows 7, Python 2.7.5, Selenium 2.33).ここでステップバイステップを見つけることができます.

更新

PhantomJS 1.9.2 がリリースされ、Ghostdriver 1.0.4 で問題が修正されました (ここを確認してください- 「クリックは成功しましたが、読み込みに失敗しました」というメッセージは表示されなくなりました)。したがって、 PhantomJS 1.9.2にアップグレードするだけで問題ありません。もう自分で何かを構築する必要はありません。

于 2013-08-19T17:16:05.600 に答える
2

ページ上にアクティブな JavaScript またはバックグラウンド AJAX がすでに存在していた可能性があります。これにより、PhantomJS は混乱して、ボタンのクリックが失敗したと判断しました。クリックする前に、待機を挿入するか、ブラウザを停止してみてください。

于 2013-07-03T12:10:03.483 に答える
0

これは修正済みのバグですが、一部の実際のページに表示されます。

回避策:

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." );
}
于 2016-06-16T22:01:15.263 に答える