在单独的函数中使用 Selenium、Webdriver python

Using Selenium, Webdriver in a separate function in python

Pyhton 3.8,Selenium 3.1.4.0,pynput 1.6.8

我有一个正在处理的 selenium 项目,它在一个文件中工作正常,但它变得相当大 300~ 行。

我想将我的项目分成一个主文件和一个函数文件。

我知道如何正常执行此操作,但是在使用 selenium 时我有点不知所措,因为您使用驱动程序。[各种事情]到处都是。

我想知道有没有什么好的方法可以让我的主文件可以看到驱动程序并使用它,我的函数文件也可以看到和使用驱动程序。

我还包括了 pynput,因为我在想也许获取键盘按下的 with open 语句(使用转义键退出项目)正在搞乱事情。我不太了解加入线程和向队列发送信息,但那是另一个 post。这个是让我的驱动程序处理多个文件。

我也知道我的函数名称很乱,我会抽空学习正确的命名约定。

加载(侦听器)是一种解决方法,直到我完全理解多线程的工作原理。

在我的主文件中有:

import functions as f

def main_Sequence(user_1, listen):
f.loading(listen)
f.sign_in(user_1)
f.loading(listen)
f.accept_Cookies()
f.loading(listen)
driver.refresh()

with keyboard.Listener(on_release=f.on_release) as listener:
    driver = start_Webdriver()
    main_Sequence(user, listener)

在我的函数文件中,我有这样的函数:

def on_release(key):  # TODO FIX Garbage listener BS
    if key == pynput.keyboard.Key.esc:
        return False

def accept_Cookies():
Cookies_box = driver.find_element_by_xpath('//button[contains(., "OK")]')
Cookies_box.click()
return

def start_Webdriver():
    # Using chrome, and maximize browser for fewer issues
    options = webdriver.ChromeOptions()
    options.add_argument("--start-maximized")
    d = webdriver.Chrome(options=options)
    # Open the website
    d.get("URL.com")
    return d

我想知道如何正确实施它。

我得到的错误是:

Traceback (most recent call last):
File "*ProjectFolder*/main.py", line 117, in <module> main_Sequence(user, listener)

File "*ProjectFolder*/main.py", line 87, in main_Sequence f.sign_in(user_1)

File "*ProjectFolder*\functions.py", line 117, in sign_in 

alert_Button = driver.find_element_by_xpath("xpath").click()

NameError: name 'driver' is not defined

我已经尝试了所有我能想到的方法,我一直推迟,因为我最初的尝试被证明是不成功的。

感谢您的帮助。

您可以使用单例模式,在您需要的任何地方获取驱动程序对象。 它看起来像这样:

class WebDriver:
    __instance__ = None

    def __init__(self):
        if WebDriver.__instance__ is not None:
            raise RuntimeError("Cannot init class twice, as it is as singelton")
        else:
            WebDriver.__instance__ = start_Webdriver()

    @classmethod
    def get_instance(cls):
        """
        :rtype: WebDriver
        """
        if cls.__instance__ is None:
            WebDriver()
        return cls.__instance__

您的代码将如下所示:

# main.py
with keyboard.Listener(on_release=f.on_release) as listener:
    driver = WebDriver.get_instance()
    main_Sequence(user, listener)


# function.py
def accept_Cookies():
    driver = WebDriver.get_instance()
    Cookies_box = driver.find_element_by_xpath('//button[contains(., "OK")]')
    Cookies_box.click()
    return