Gtk Window 在 Selenium 自动化期间无响应

Gtk Window Non-Responsive During Selenium Automation

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

基本上,用户按下按钮启动 Selenium webdriver 自动化,然后随着自动化过程的进行,它 'SHOULD' 在 GUI 中向用户提供反馈(参见 Content.content_liststore.append(列表(item)) 和 LogBox.log_text_buffer).

但是,在 fb_driver.close() 完成之前,它不会向 content_liststore 添加任何内容。与此同时,Gtk window 只是 "hangs".

现在,我一直在研究多线程,希望 GUI 能够响应此反馈,但我也一直在阅读 Selenium 不喜欢多线程(但我认为那是 运行 多个 browsers/tabs(这不是))。

所以,我的问题是;多线程是让它工作的首选解决方案吗?

            # 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' 循环,但另一段代码没有循环并做完全相同的事情,它等待 Selenium 完成后再添加内容图形用户界面。

此外,用户可以 select 多个网站来做这件事,所以应用程序可以先去 Facebook(做生意然后关闭),去 LinkedIn(做生意然后关闭)等等第四。在向 Gtk GUI 添加任何内容之前,它仍然会等待所有 Selenium 代码完成。

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

您的问题就是您要寻找的答案。在这里阅读 https://wiki.gnome.org/Projects/PyGObject/Threading