簡體   English   中英

python 中的分裂 chromedriver 崩潰

[英]splinter chromedriver crash in python

我正在嘗試使 python 程序在我的 Mac 機器上運行,其中正在使用 splinter 庫。 不幸的是,每當我嘗試運行程序時,程序就會崩潰。 程序作者: https://github.com/lrnq/supremeBot

每當我嘗試運行該程序時,它會快速打開瀏覽器 3 次,但立即崩潰。 我收到的錯誤是:

Traceback (most recent call last):
  File "/Users/yusuf/PycharmProjects/supremeBot/supremeBot/main.py", line 113, in <module>
    BOT.initializeBrowser()
  File "/Users/yusuf/PycharmProjects/supremeBot/supremeBot/main.py", line 25, in initializeBrowser
    self.b = Browser('chrome', **executable_path)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/splinter/browser.py", line 90, in Browser
    return get_driver(driver, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/splinter/browser.py", line 68, in get_driver
    raise e
UnboundLocalError: local variable 'e' referenced before assignment

知道為什么會發生這種情況或如何解決這個問題嗎?

initializeBrowser function 出現錯誤的地方:

def initializeBrowser(self):
    driver = self.info["driver"]
    #path = helpers.get_driver_path(driver)

    print(driver)

    if driver == "geckodriver":
        self.b = Browser()
    elif driver == "chromedriver":
        executable_path = {"executable_path": "/usr/local/bin/chromedriver"}
        self.b = Browser('chrome', **executable_path)

我已經在終端中使用以下命令安裝了庫:

pip3 install splinter requests bs4

此外,chromedriver 位於 bin 文件夾中:

/usr/local/bin/chromedriver

另外,在 path 中添加了 chomedriver:

sudo nano /etc/paths: `/usr/local/bin/chromedriver`

程序:

#!/usr/bin/env python3
import requests
import bs4 as bs
from splinter import Browser
#import helpers


class supremeBot(object):
    def __init__(self, **info):
        self.base_url = 'http://www.supremenewyork.com/'
        self.shop = 'shop/all/'
        self.checkout = 'checkout/'
        self.info = info

    def initializeBrowser(self):
        driver = self.info["driver"]
        #path = helpers.get_driver_path(driver)

        print(driver)

        if driver == "geckodriver":
            self.b = Browser()
        elif driver == "chromedriver":
            executable_path = {"executable_path": "/usr/local/bin/chromedriver"}
            self.b = Browser('chrome', **executable_path)


    def findProduct(self):
        try:
            r = requests.get(
                "{}{}{}".format(
                    self.base_url,
                    self.shop,
                    self.info['category'])).text
            soup = bs.BeautifulSoup(r, 'lxml')

            temp_tuple = []
            temp_link = []

            for link in soup.find_all('a', href=True):
                temp_tuple.append((link['href'], link.text))
            for i in temp_tuple:
                if i[1] == self.info['product'] or i[1] == self.info['color']:
                    temp_link.append(i[0])

            self.final_link = list(
                set([x for x in temp_link if temp_link.count(x) == 2]))[0]
            return True
        except:
            return False

    def visitSite(self):
        self.b.visit(
            "{}{}".format(
                self.base_url, str(
                    self.final_link)))
        self.b.find_option_by_text(self.info['size']).click()
        self.b.find_by_value('add to basket').click()

    def checkoutFunc(self):

        self.b.visit("{}{}".format(self.base_url, self.checkout))

        self.b.fill("order[billing_name]", self.info['namefield'])
        self.b.fill("order[email]", self.info['emailfield'])
        self.b.fill("order[tel]", self.info['phonefield'])

        self.b.fill("order[billing_address]", self.info['addressfield'])
        self.b.fill("order[billing_city]", self.info['city'])
        self.b.fill("order[billing_zip]", self.info['zip'])
        self.b.select("order[billing_country]", self.info['country'])

        self.b.select("credit_card[type]", self.info['card'])
        self.b.fill("credit_card[cnb]", self.info['number'])
        self.b.select("credit_card[month]", self.info['month'])
        self.b.select("credit_card[year]", self.info['year'])
        self.b.fill("credit_card[ovv]", self.info['ccv'])
        self.b.find_by_css('.terms').click()
        #self.b.find_by_value("process payment").click()


if __name__ == "__main__":
    INFO = {
        "driver": "chromedriver",
        "product": "Raglan Court Jacket",
        "color": "Pale Yellow",
        "size": "Large",
        "category": "jackets",
        "namefield": "example",
        "emailfield": "example@example.com",
        "phonefield": "XXXXXXXXXX",
        "addressfield": "example road",
        "city": "example",
        "zip": "72046",
        "country": "GB",
        "card": "visa",
        "number": "1234123412341234",
        "month": "09",
        "year": "2020",
        "ccv": "123"
    }
    BOT = supremeBot(**INFO)
    # Flag to set to true if you want to reload the page continously close to drop.
    found_product = False
    max_iter = 10
    counter = 1
    while not found_product and counter < max_iter:
        found_product = BOT.findProduct()
        print("Tried ", counter, " times")
        counter += 1
    if not found_product:
        raise Exception("Couldn't find product. Sry bruh")
    BOT.initializeBrowser()
    BOT.visitSite()
    BOT.checkoutFunc()

看起來 splinter 在他們的代碼中有一個錯誤,導致您沒有正確的錯誤消息。 您可以在他們的問題中指出一點。 這可能與從 python2 到 python3 的一些問題有關。 這個答案解釋了這如何在這里很好地發生。

您可以做一些事情來嘗試自己解決問題。 我認為問題與您的 chromedriver 未正確訪問有關。

  1. 確保您的 chromedriver 和您的 google chrome 瀏覽器版本相同。 例如,如果您的瀏覽器版本為 81.xxxx,請確保您的 chromedriver 也是 81.xxx 版本

  2. 將您的 chromedriver 放在與調用 main.py 的目錄相同的目錄中

  3. self.b = Browser('chrome', **executable_path)行更改為self.b = Browser('chrome', **executable_path, headless=False)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM