我寫的程式,在Windows 上會出錯,但相同的程式碼在 macOS 上沒有出錯,很奇怪。是 macOS 那邊的架構比較漂亮嗎?呵呵呵。
有錯誤的環境:
- Windows 7
- Python 3.7.9
- selenium 4.0
- geckodriver 0.30
顯示錯誤訊息如下:
File "Z:\tixcraft\selenium\webdriver\remote\webdriver.py", line 400, in execute self.error_handler.check_response(response) File "Z:\tixcraft\selenium\webdriver\remote\errorhandler.py", line 236, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchWindowException: Message: Browsing context has been discarded Stacktrace: WebDriverError@chrome://remote/content/shared/webdriver/Errors.jsm:183:5 NoSuchWindowError@chrome://remote/content/shared/webdriver/Errors.jsm:437:5 assert.that/<@chrome://remote/content/shared/webdriver/Assert.jsm:435:13 assert.open@chrome://remote/content/shared/webdriver/Assert.jsm:143:4 GeckoDriver.prototype.navigateTo@chrome://remote/content/marionette/driver.js:82 1:34 despatch@chrome://remote/content/marionette/server.js:306:40 execute@chrome://remote/content/marionette/server.js:279:16 onPacket/<@chrome://remote/content/marionette/server.js:252:20 onPacket@chrome://remote/content/marionette/server.js:253:9 _onJSONObjectReady/<@chrome://remote/content/marionette/transport.js:500:20
觸發錯誤的程式碼:
driver.get(url)
執行畫面:
geckodriver 下載:
https://github.com/mozilla/geckodriver/releases
geckodriver 使用說明:
https://firefox-source-docs.mozilla.org/testing/geckodriver/index.html
修改後的完整程式碼:
https://github.com/max32002/tixcraft_bot/
這個發生的原因很奇怪,透過只寫簡單的程式,發現是沒有問題。所以慢慢把簡單的程式加入為複雜程式之後,發現是類似 memory leak 的錯誤,如果有去開檔,而且是在 python 的global 層,會因為記憶體可能沒有去回收,造成上面的錯誤。以上全是我個人的猜測。
解決的辦法是不要寫程式在 script 的第一層(內縮值=0),把開檔存取放在 def 的 function 裡,就解決了。
其實,這應該很好避免,結果花了大約8小時去retry , 去 google 相關解法,結果是都沒看到其他人有遇到,呵呵呵。