2017-11-13 12 views
0

良い午後:) Python3 Gtk3アプリケーションとSelenium WebDriver(ChromeDriver)に問題があります。また、Linuxが重要な場合はそれを使用してください。Gtkウィンドウがセレンオートメーション中に反応しない

基本的に、ユーザーはSelenium webdriverの自動化を開始するためにボタンを押してから、自動化プロセスが進行するにつれて、GUI上でユーザーにフィードバックを与えるべきです(Content.content_liststore.append(list(item) )とLogBox.log_text_buffer)。

しかし、fb_driver.close()が完了するまで、content_liststoreには何も追加されません。その間、Gtkウィンドウはちょうど "ハングする"。

GUIがこのフィードバックに反応することを期待して、マルチスレッドを検討してきましたが、Seleniumがマルチスレッドを好まないことも読んでいます(ただし、複数のブラウザ/タブを実行していると仮定していますそうでない))。

私の質問は次のとおりです。マルチスレッドはこれを動作させるために修正する必要がありますか?

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

私はそれが理由コードの別の部分がループを持っているとまったく同じことをしていない「ながら」ループ、しかし、それがコンテンツを追加する前に終了するセレンのを待つのに動作していないと考えられてきましたGUI。

さらに、ユーザーはこれを行う複数のウェブサイトを選択することができるので、アプリケーションはまずFacebookに行くことができます(ビジネスをしてから閉じる)し、LinkedInに行きます。 GtkのGUIに何かを追加する前に、すべてのセレンコードが終了するのを待ちます。

本当に意味があることを願っています。ありがとうございました:)

+1

GUIを実行していないスレッドでSeleniumスクリプトを実行する必要があります。 –

+0

ありがとうございます、あなたとGiedrius.Sは正しい方向に私を指摘しました! – dkspencer

答えて

関連する問題