在Selenium自动化期间Gtk窗口无响应

时间:2017-11-13 15:15:02

标签: multithreading python-3.x selenium selenium-webdriver gtk3

下午好:)我的Python3 Gtk3应用程序和Selenium WebDriver(ChromeDriver)出现问题。此外,如果重要,请使用Linux。

基本上,用户按下按钮启动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()

我认为它因为'while'循环而无法正常工作,但是另一段代码没有循环并完全相同,它在向GUI添加内容之前等待Selenium完成。< / p>

此外,用户可以选择多个网站来执行此操作,因此应用程序可以首先进入Facebook(做生意然后关闭),转到LinkedIn(做生意然后关闭)等等。在向Gtk GUI添加任何内容之前,它仍然等待所有Selenium代码完成。

我真的希望这是有道理的!谢谢:))

1 个答案:

答案 0 :(得分:0)

你的问题是你所期待的答案。在这里阅读https://wiki.gnome.org/Projects/PyGObject/Threading