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

在python中使用Selenium、Webdriver和单独的函数,python,selenium,google-chrome,webdriver,pynput,Python,Selenium,Google Chrome,Webdriver,Pynput,Pyhton 3.8、Selenium 3.1.4.0、pynput 1.6.8 我有一个selenium项目,它在一个文件中可以正常工作,但是它有300行 我想把我的项目分成一个主文件和一个函数文件 我知道如何正常操作,但当使用selenium时,我有点不知所措,因为到处都使用driver。[各种各样的东西] 我想知道是否有一个好的方法,使我的主要可以看到驱动程序和使用它,我的功能文件也可以看到和使用驱动程序 我还包括了pynput,因为我想可能是with open语句(使用escape键退出

Pyhton 3.8、Selenium 3.1.4.0、pynput 1.6.8

我有一个selenium项目,它在一个文件中可以正常工作,但是它有300行

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

我知道如何正常操作,但当使用selenium时,我有点不知所措,因为到处都使用driver。[各种各样的东西]

我想知道是否有一个好的方法,使我的主要可以看到驱动程序和使用它,我的功能文件也可以看到和使用驱动程序

我还包括了pynput,因为我想可能是with open语句(使用escape键退出项目)搞乱了事情。我真的不明白加入线程和发送信息到队列,但这是另一篇文章。这是让我的驱动程序在多个文件上工作

我也知道我的函数名很乱,我会在某个时候学习正确的命名约定

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

在我的主文件中,我有:

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
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
我想知道如何正确地实施这一点

我得到的错误是:

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
回溯(最近一次呼叫最后一次):
文件“*ProjectFolder*/main.py”,第117行,按main_顺序(用户、侦听器)
文件“*ProjectFolder*/main.py”,第87行,按主顺序f.sign(用户1)
文件“*ProjectFolder*\functions.py”,第117行,登录
警报按钮=驱动程序。通过xpath(“xpath”)查找元素。单击()
NameError:未定义名称“驱动程序”
我已经尝试了我能想到的一切,我推迟了,因为我的首字母尝试没有成功


谢谢您的帮助。

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

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
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
您的代码如下所示:

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
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

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

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
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
您的代码如下所示:

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
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

name错误:未定义名称“驱动程序”
。将
驱动程序
实例作为参数发送到使用
驱动程序
的方法错误:未定义名称“驱动程序”。将
驱动程序
实例作为参数发送给使用
驱动程序
的方法。非常感谢!我认为它是有效的,我只需要更改行cls.\uuuuu instance\uuuu=Data\u Presenter(),否则它就不会发现实例被更改了,也许这不是你应该怎么做的,但它工作起来很有魅力。只要改变这一行,我就会把它作为公认的答案。啊,我错了。我试过了,叫它DataPresenter。忘记将所有内容更改为webdriver。我现在把它改成了我想要做的,我的意思是这样的,如果不是的话,它只是不断地创造新的实例。在get\u实例中,在
if cls.\uu实例\uuuuuu是None:
而不是简单的
WebDriver()
我需要放置
cls.\uu实例\uuuuu=WebDriver()
我仍然不知道这是否是最好的方法,但这是目前对我有效的方法。非常感谢!我认为它是有效的,我只需要更改行cls.\uuuuu instance\uuuu=Data\u Presenter(),否则它就不会发现实例被更改了,也许这不是你应该怎么做的,但它工作起来很有魅力。只要改变这一行,我就会把它作为公认的答案。啊,我错了。我试过了,叫它DataPresenter。忘记将所有内容更改为webdriver。我现在把它改成了我想要做的,我的意思是这样的,如果不是的话,它只是不断地创造新的实例。在get\u实例中,在
if cls.\uu实例\uuuuuu是None:
而不是简单的
WebDriver()
我需要放置
cls.\uu实例\uuuu=WebDriver()
我仍然不知道这是否是最好的方法,但这是目前对我有效的方法。