在python中使用Selenium、Webdriver和单独的函数
Pyhton 3.8、Selenium 3.1.4.0、pynput 1.6.8 我有一个selenium项目,它在一个文件中可以正常工作,但是它有300行 我想把我的项目分成一个主文件和一个函数文件 我知道如何正常操作,但当使用selenium时,我有点不知所措,因为到处都使用driver。[各种各样的东西] 我想知道是否有一个好的方法,使我的主要可以看到驱动程序和使用它,我的功能文件也可以看到和使用驱动程序 我还包括了pynput,因为我想可能是with open语句(使用escape键退出项目)搞乱了事情。我真的不明白加入线程和发送信息到队列,但这是另一篇文章。这是让我的驱动程序在多个文件上工作 我也知道我的函数名很乱,我会在某个时候学习正确的命名约定 在我完全理解多线程的工作原理之前,加载(侦听器)是一种解决方法 在我的主文件中,我有:在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键退出
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()
我仍然不知道这是否是最好的方法,但这是目前对我有效的方法。