0

Guten Nachmittag :) Habe ein Problem mit meiner Python3 Gtk3 Anwendung und Selenium WebDriver (ChromeDriver). Unter Linux auch, wenn es darauf ankommt.Gtk Fenster reagiert nicht während Selenium

Grundsätzlich drückt der Benutzer eine Taste, um die Selenium-Webdriver-Automatisierung zu starten. Wenn der Automatisierungsprozess läuft, "SOLLTE" er dem Benutzer eine Rückmeldung in der GUI geben (siehe Content.content_liststore.append (list (item)) und LogBox.log_text_buffer).

Es wird jedoch nichts in den content_liststore eingefügt, bis fb_driver.close() fertig ist. In der Zwischenzeit "hängt" das Gtk-Fenster.

Jetzt habe ich in Multithreading in der Hoffnung auf die GUI reagiert auf dieses Feedback untersucht, aber ich habe auch gelesen, dass Selen nicht wie Multithreading (aber ich nehme an, dass das Ausführen mehrerer Browser/Tabs (was dies ist nicht)).

Also, meine Frage ist; Ist Multithreading das Go-to-Fix, um dies zum Laufen zu bringen?

  # ELSE IF, FACEBOOK COOKIES DO NOT EXIST, PROCEED TO LOGIN PAGE 
      elif os.stat('facebook_cookies').st_size == 0: 
       while True: 
        try: # look for element, if not found, refresh the webpage 
         assert "Facebook" in fb_driver.title 
         login_elem = fb_driver.find_element_by_id("m_login_email") 
         login_elem.send_keys(facebook_username) 
         login_elem = fb_driver.find_element_by_id("m_login_password") 
         login_elem.send_keys(facebook_password) 
         login_elem.send_keys(Keys.RETURN) 
        except ElementNotVisibleException: 
         fb_driver.refresh() 
         StatusBar.status_bar.push(StatusBar.context_id, "m_login_password element not found, trying again...") 
         ProblemsLog.text_buffer.set_text("Facebook has hidden the password field, refreshing page...") 
        else: 
         query_elem = fb_driver.find_element_by_name("query") 
         query_elem.send_keys(target) 
         query_elem.send_keys(Keys.RETURN) 
         break 

       m_facebook_url_remove = "query=" 
       m_facebook_url = fb_driver.current_url.split(m_facebook_url_remove, 1)[1] # Remove string before "query=" 
       facebook_url = "https://www.facebook.com/search/top/?q=" + m_facebook_url # Merge left-over string with the desktop url 

       StatusBar.status_bar.push(StatusBar.context_id, "Facebook elements found") 
       fb_title = fb_driver.title 
       fb_contents = [(target_name.title(), "Facebook", facebook_url)] 
       for item in fb_contents: 
        Content.content_liststore.append(list(item)) 
       #progress_bar.set_fraction(0.10) 
       LogBox.log_text_buffer.set_text("Facebook Search Complete") 

       with open('facebook_cookies', 'wb') as filehandler: 
        pickle.dump(fb_driver.get_cookies(), filehandler) 

       fb_driver.close() 

halte ich habe es nicht wegen der Arbeit ‚während‘ Schleife, aber ein anderes Stück Code nicht über eine Schleife und macht genau das gleiche, es wartet auf Selenium vor zu beenden Hinzufügen von Inhalten zu die GUI.

Darüber hinaus kann der Benutzer mehrere Websites auswählen, um dies zu tun, so dass die Anwendung zuerst auf Facebook gehen kann (dann schließen), gehen Sie zu LinkedIn (machen Sie es Geschäft dann schließen) und so viertens. Und es wartet immer noch darauf, dass der gesamte Selenium-Code beendet ist, bevor etwas zur Gtk-GUI hinzugefügt wird.

Ich hoffe wirklich, dass das Sinn macht! Danke :)

+1

Sie müssen Ihr Selenium-Skript auf einem Thread ausführen, der nicht die GUI ausführt. –

+0

Danke, Sie und Giedrius.S haben mich in die richtige Richtung! – dkspencer

Antwort

Verwandte Themen