我在pycharm中编写了一个python程序,包括FBCrawl.py,html_login.py,common / glovar.py,在glovar.py中,我定义了一个变量webdriver_browser,并希望在FBCrawl.py和html_login.py中使用这个webdriver_browser ,主要目的是登录facebook并获取页面内容,使用selenium,程序如下,但运行时, 错误:
C:\Python\Python36\python.exe C:/Python/PyCharmProject/FaceBookCrawl/FBCrawl.py
None
Exception ignored in: <bound method Service.__del__ of <selenium.webdriver.chrome.service.Service object at 0x00000146BF1FD438>>
Traceback (most recent call last):
File "C:\Python\Python36\lib\site-packages\selenium\webdriver\common\service.py", line 173, in __del__
File "C:\Python\Python36\lib\site-packages\selenium\webdriver\common\service.py", line 149, in stop
File "C:\Python\Python36\lib\site-packages\selenium\webdriver\common\service.py", line 120, in send_remote_shutdown_command
ImportError: sys.meta_path is None, Python is likely shutting down
Process finished with exit code 0
该计划在此处:
FBCrwal.py:
from common import glovar
from html_login import HtmlLogin
from selenium import webdriver
if __name__ == '__main__':
baseurl = "http://www.google.com"
#log in the website
login_url = "https://www.facebook.com/login.php?login_attempt=1&lwv=110"
HtmlLogin().login(login_url)
html_cont = glovar.webdriver_browser.get("https://www.facebook.com/alexis.n.griffith.3")
print(html_cont)
html_login.py:
from selenium import webdriver
from common import glovar
class HtmlLogin(object):
def login(self,url):
if url is None:
return
login_url = url
glovar.webdriver_browser = webdriver.Chrome()
glovar.webdriver_browser.get(login_url)
#user credentials
user = glovar.webdriver_browser.find_element_by_css_selector("#email")
user.send_keys('********@gmail.com')
password = glovar.webdriver_browser.find_element_by_css_selector("#pass")
password.send_keys('********')
login = glovar.webdriver_browser.find_element_by_css_selector("#loginbutton")
login.click()
glovar.py:
webdriver_browser = None
你可以告诉我原因以及如何解决它
答案 0 :(得分:2)
如果您仍在寻找答案:请尝试使用
结束您的脚本glovar.webdriver_browser.quit()
我遇到了同样的错误,只是添加了这一行就解决了。希望它有所帮助
答案 1 :(得分:0)
如果您使用多线程运行后台任务并且主程序线程完成,则会出现错误。此时Python解释器将开始被销毁,但如果守护程序线程中的后台任务仍在运行并且在C代码中运行,它仍然可以运行。
这会导致问题,因为解释器是被破坏的一部分。出现这种情况的一个症状就是您所看到的,因为在销毁解释器时,模块中的任何对象查找都会在模块内容被清除时开始返回None
。这被检测到,你得到了这个错误。
如何解决这种情况实际上取决于代码的作用。一种方法可能是识别后台任务并等待它完成,可能使用某种方式表示线程应该停止,否则它将无限期地运行。
挖掘硒代码的另一个原因可能是更好的解释是将__del__
()方法添加到对象中以进行工作,并且在解释器关闭时销毁对象时调用这些方法。如果您追踪硒代码,则它们是在__del__()
方法中进行模块的惰性导入。因为在解释器被销毁时正在调用__del__()
,所以该模块已被清除为解释并且失败。
如果是这种情况,您唯一能做的就是在退出程序之前从代码中明确地停止selenium驱动程序。这样你就可以在解释器被破坏之前完成它。
这是一个你应该真正问硒人的问题,或者查看文档以了解你是否错误地使用了API。也就是说,在__del__
()方法中执行内容是不好的做法,就像selenium代码一样。只要他们继续这样做,除非你只是错误地使用他们的API,否则很难阻止它。