Programmstatus mit Python abfragen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
bcit6k
User
Beiträge: 77
Registriert: Mittwoch 23. Juli 2008, 08:50

Dienstag 19. August 2008, 09:38

Hallo,

ich habe ein kleines Problem. Ich öffnen einen Webbrowser und lad da eine Website. Das geht noch kein Problem. Aber ich will nun so lange warten bis die ganze Website geladen ist und erst dann mit python weitermachen.
Gibt es nun die Möglichkeit den Browserstatus ab zu rufen? das ich weis wann er fertig ist?

danke
Benutzeravatar
snafu
User
Beiträge: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 19. August 2008, 10:19

Geht es darum, die Seite tatsächlich im Browser zu sehen oder nur deren Inhalt weiterzuverarbeiten? Für letzteres würde sich nämlich "mechanize" anbieten, oder - sofern du einfach nur eine Seite laden willst - die urllib.

Um solche Nachfragen zu vermeiden, hätte man übrigens ein Codesnippet mitposten können, aus dem ersichtlich ist, was du bisher genau tust (inbesondere welcher Browser verwendet wird). ;)
bcit6k
User
Beiträge: 77
Registriert: Mittwoch 23. Juli 2008, 08:50

Dienstag 19. August 2008, 10:34

hi,

ich muss die seite schon anzeigen da ich das sonst nicht an den drucker übergeben kann. ich drucke das ganze in ein pdf.
ja klar kann ich den code posten, glaub aber in desem fall nicht das das was bringt.

als browser verwende ich ie! (zur zeit)

Code: Alles auswählen

try:
		handle = findTopWindow(wantedText="Internet Explorer")
		app = Application().connect_(handle=handle)
		print "Browserwindow found"
		err_file.writelines("Browserwindow found IE\n")
	except:
		app = Application.start("C:\Programme\Internet Explorer\IEXPLORE.EXE")
		print "Browserwindow starting"
		err_file.writelines("Browserwindow starting IE\n")
	#app.top_window_().print_control_identifiers()
	dlg = app['Internet Explorer']
	dlg = app.top_window_()
	app.dlg.control
	time.sleep(2)
	url_login= "http://localhost/login.php"
	app.top_window_().Edit.TypeKeys(url_login)
	error_msg = "type url %s \n" % url_login
	err_file.writelines(error_msg)
	app.top_window_().TypeKeys("{ENTER}")
	err_file.writelines("Enter pressed \n")
	time.sleep(3)
danke für die hilfe!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 19. August 2008, 17:01

Hast du mal versucht den IE via COM anzusprechen? Ich könnte mir vorstellen, dass er irgendwelche Ready-Flags hat.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
bcit6k
User
Beiträge: 77
Registriert: Mittwoch 23. Juli 2008, 08:50

Mittwoch 20. August 2008, 07:16

hallo,

ich hab was gefunden das super funktioniert

über die win32com.client

Code: Alles auswählen

ie = Dispatch("InternetExplorer.Application")
ie.Visible = 1
ie.Navigate("www.website.de")
while ie.Busy:
	time.sleep(0.1)
danke!
Benutzeravatar
snafu
User
Beiträge: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 20. August 2008, 15:51

Könnte man vielleicht auch etwas sauberer machen:

Code: Alles auswählen

while True:
    if not ie.Busy:
        break
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 20. August 2008, 15:55

Naja, ob eine Busy-Loop mit 100% CPU auslastung und sehr vielen Polls sinnvoll ist? Man sollte da mindestens noch ein ``time.sleep`` reinpacken.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
snafu
User
Beiträge: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 20. August 2008, 21:13

Du meinst sogar eher noch die Wartezeit auf eine Sekunde erhöhen oder so?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 21. August 2008, 07:03

snafu hat geschrieben:Du meinst sogar eher noch die Wartezeit auf eine Sekunde erhöhen oder so?
Nein, das vielleicht nicht, weil dann die Reaktivität sinkt. Man müsste die CPU-Auslastung im Auge behalten und einen Kompromiss zwischen Delay-Dauer und CPU-Zeit finden.

Optimal wäre es natürlich könnte man bei COM Callbacks angeben die Aufgerufen werden wenn es nicht mehr Busy ist. Da könnte man einen Ansatz wie Trellis oder Twisteds Deferreds gebrauchen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Donnerstag 21. August 2008, 07:22

@snafu: Ich seh nicht wo die ``while True``-Schleife sauberer ist. Nur komplizierter und damit IMHO die schlechtere Wahl.
Benutzeravatar
snafu
User
Beiträge: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Donnerstag 21. August 2008, 08:28

Naja, kein sleep, dachte ich. Aber die Wartezeit ist ja hier sogar ausdrücklich erwünscht.
BlackJack

Donnerstag 21. August 2008, 09:10

Selbst ohne `sleep()` wäre Deine Lösung komplizierter als sie sein müsste:

Code: Alles auswählen

while ie.Busy: 
    pass
Benutzeravatar
snafu
User
Beiträge: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Donnerstag 21. August 2008, 09:46

Aha. Ich wusste nicht, dass es auch so geht.
DANIone
User
Beiträge: 11
Registriert: Sonntag 15. Juni 2008, 19:07
Wohnort: Deutschland

Mittwoch 26. November 2008, 01:50

Ich krame das Thema hier noch einmal heraus, so alt ist es ja auch noch nicht...
Ich stehe nämlich vor genau demselben Problem, dass ich möchte, dass die Website, die ich per mechanize(was ja oben schon einmal erwähnt wurde) aufrufe, fertig geladen sein soll bevor das Script fortgesetzt wird.

Soweit ich herausgefunden habe gibt es allerdings nicht wie beim IE ein .Busy oder ähnliches.

Was empfehlt ihr mir, damit ich herausfinde wann die Seite fertig geladen ist und dann mein Script fortsetzen kann?

Hier mal der Code auf den es ankommt:

Code: Alles auswählen

from mechanize import Browser

br = Browser()
br.open('MeineURL')

#Hier soll nun der Check hin ob die Website fertig geladen ist

#Hier dann der nachfolgende Code
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 26. November 2008, 09:32

Blockiert mechanize nicht sowieso, bis es fertiggeladen hat?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten