2017-07-23 7 views
4

Ich arbeite an einem Skript, um einige Informationen von einer Website zu ziehen, die ich anmelden muss zu verwenden. Ich benutze Python 2.7.12 und Selenium 3.4.3.Python-Skript läuft in der Konsole, aber Fehler als Skript

#!/usr/bin/python 
from selenium import webdriver 
browser = webdriver.Firefox(firefox_binary='/usr/bin/firefox', executable_path="./geckodriver") 

# Get to the login page 
browser.get('https://example.com') 
browser.find_element_by_link_text('Application').click() 

# Login 
browser.find_element_by_id('username').send_keys('notmyusername') 
browser.find_element_by_id('password').send_keys('notmypassword') 
browser.find_element_by_css_selector('.btn').click() 

# Open the application 
try: 
    browser.find_element_by_id('ctl00_Banner1_ModuleList_ctl01_lnkModule').click() 
except: 
    print('failed') 

#browser.stop() 

Wenn ich diesen Code kopieren und in die Python-Konsole einfügen, es läuft ganz gut und geht auf die Seite, die ich will. Wenn ich jedoch das Skript vom Terminal aus starte (bash auf Linux Mint 18), wird es fehlerhaft. Hier ist die Ausgabe mit den Try-and-Catch-Anweisungen entfernt:

Ich weiß nicht einmal, wie man sich um die Fehlersuche geht. Irgendeine Hilfe?

bearbeiten

Hier ist ein Ausschnitt aus der Verbindung auszuwählen Ich versuche:

  <li> 
       <a id="ctl00_Banner1_ModuleList_ctl00_lnkModule" class="should-show ui-should-show header-4" AutoSetting="false" data-role="button" href="javascript:__doPostBack(&#39;ctl00$Banner1$ModuleList$ctl00$lnkModule&#39;,&#39;&#39;)"><span>Link A</span></a> 
       <noscript> 
        <input type="submit" name="ctl00$Banner1$ModuleList$ctl00$btnModule" value="Link A" id="ctl00_Banner1_ModuleList_ctl00_btnModule" class="header-4 button-as-link" /> 
       </noscript> 
      </li> 

      <li> 
       <a id="ctl00_Banner1_ModuleList_ctl01_lnkModule" class="should-show ui-should-show" AutoSetting="false" data-role="button" href="javascript:__doPostBack(&#39;ctl00$Banner1$ModuleList$ctl01$lnkModule&#39;,&#39;&#39;)"><span>Link B</span></a> 
       <noscript> 
        <input type="submit" name="ctl00$Banner1$ModuleList$ctl01$btnModule" value="Link B" id="ctl00_Banner1_ModuleList_ctl01_btnModule" class="button-as-link" /> 
       </noscript> 
      </li> 

      <li> 
       <a id="ctl00_Banner1_ModuleList_ctl02_lnkModule" class="should-show ui-should-show" AutoSetting="false" data-role="button" href="javascript:__doPostBack(&#39;ctl00$Banner1$ModuleList$ctl02$lnkModule&#39;,&#39;&#39;)"><span>Link C</span></a> 
       <noscript> 
        <input type="submit" name="ctl00$Banner1$ModuleList$ctl02$btnModule" value="Link C" id="ctl00_Banner1_ModuleList_ctl02_btnModule" class="button-as-link" /> 
       </noscript> 
      </li> 

</ul> 
+2

haben Sie mit etwas Wartezeit versucht? –

+0

@muraliselenium Meinst du warten im Skript? Selenium scheint zu warten, bis die Seite geladen ist, bevor irgendwelche Maßnahmen ergriffen werden. Das Skript ist fehlerhaft und wird nicht mehr ausgeführt, nachdem das Element nicht anhand der ID gefunden wurde. –

+0

Ja, du hast Recht. aber manchmal hilft thread.sleep in Java. Also nur zu wissen, ob du es versucht hast oder nicht. –

Antwort

2

Was höchstwahrscheinlich passiert ist, dass, wenn Sie das Skript von bash ausführen, das Skript zu läuft schnell und die get_by_id Operation wird gestartet, bevor der Browser die Seite geladen hat, was zu diesem Fehler führt.

Da @ murali-selenium vorgeschlagen wurde, sollten Sie wahrscheinlich etwas Wartezeit hinzufügen, bevor Sie nach Dingen im Dokument suchen.

dass auf diese Weise achived werden können:

#!/usr/bin/python 
from selenium import webdriver 
import time 

wait_time_sec = 1 

browser = webdriver.Firefox(firefox_binary='/usr/bin/firefox', executable_path="./geckodriver") 

# Get to the login page 
browser.get('https://example.com') 
time.sleep(wait_time_sec) 
browser.find_element_by_link_text('Application').click() 
time.sleep(wait_time_sec) 

# Login 
browser.find_element_by_id('username').send_keys('notmyusername') 
browser.find_element_by_id('password').send_keys('notmypassword') 
browser.find_element_by_css_selector('.btn').click() 
time.sleep(wait_time_sec) 

# Open the application 
try: 
    browser.find_element_by_id('ctl00_Banner1_ModuleList_ctl01_lnkModule').click() 
except: 
    print('failed') 

#browser.stop() 
+0

Per Selen Docs, könnte dies eine noch bessere Lösung sein, abhängig von der Situation 'browser.implicitly_wait (10) # Sekunden'. Dies bewirkt, dass es bis zu 10 Sekunden lang weiter prüft, bevor es zu einem Fehler kommt. Ich habe es aber noch nicht getestet. [Link zur Dokumentation] (http://selenium-python.readthedocs.io/waits.html) –

Verwandte Themen