下午好:)我的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代码完成。
我真的希望这是有道理的!谢谢:))