1
"""pip install selenium""" 

import os, time, subprocess, random 

from functools import wraps 

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.select import Select 


class WebdriverChauffuer(object): 

    def __init__(self, username=None, password=None, start_url=None): 
     self.username = username 
     self.password = password 
     self.start_url = start_url 

    def quit(self): 
     self.driver.quit() 

    def restart_driver(self): 
     self.driver.quit() 
     self.start_driver() 

    def get(self, url): 
     self.driver.get(url) 

    def maximize_window(self): 
     self.driver.maximize_window() 



class FirefoxDriver(WebdriverChauffuer): 

    def __init__(self, username=None, password=None, start_url=None, driver=None): 
     super(FirefoxDriver, self).__init__(username=username, password=password, start_url=start_url) 
     self.start_driver() 

    def start_driver(self): 
     self.driver = webdriver.Firefox() 

的目标是有将动态函数添加到类中; Python的

class WebdriverChauffuer(object): 

    def __init__(self, username=None, password=None, start_url=None): 
     self.username = username 
     self.password = password 
     self.start_url = start_url 

    def quit(self): 
     self.driver.quit() 

    def restart_driver(self): 
     self.driver.quit() 
     self.start_driver() 

    def generate_methods(self): 
     funcs = ['get', 'maximize_window'] 
     # makes get and maximize_window 

那么你可以做

In [14]: d = FirefoxDriver() 

In [15]: d.get('google.com') 

In [16]: d.maximize_window() 

这是有希望的,但没有奏效Python dynamic function creation with custom names

class Driver(object): 
    pass 


class FuncTester(object): 

    def __init__(self): 
     self.driver = Driver() 
     self.generate_instance_methods() 

    def make_method(self, name): 
     def _method(self): 
      getattr(self.driver, name)(*args, **kwargs) 
     return _method 

    def generate_instance_methods(self): 
     FUNCTIONS = ['get', 'maximize_window'] 
     for name in FUNCTIONS: 
      _method = self.make_method(name) 
      setattr(self, name, _method) 



In [11]: f = FuncTester() 

In [12]: f.driver 
f.driver 

In [12]: f.driver. 
    File "<ipython-input-12-9e167ce57f62>", line 1 
    f.driver. 
      ^
SyntaxError: invalid syntax 


In [13]: f.driver.get 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
<ipython-input-13-7e99453babae> in <module>() 
----> 1 f.driver.get 

AttributeError: 'Driver' object has no attribute 'get' 

回答

1

你为什么不只需将Selenium Driver对象传递给您的FuncTester,如下所示:

class FuncTester(webdriver) 

我不是100%肯定会工作,而不是在安装了硒的计算机上,但我认为这样会起作用。只需通过FuncTester webdriver对象。

然后,当你这样做:

f = new FuncTester() 

尝试:

f.get() 

我不过要小心,不要覆盖硒webdriver的功能与自己的一样,如果你离开了你会是这样,

FUNCTIONS = ['get', 'maximize_window'] 

在你的代码中。

那么对于这样的事情:

def restart_driver(self): 
    self.driver.quit() 
    self.start_driver() 

只是做:明天

def restart_driver(self): 
    self.quit() //This got changed! 
    self.start_driver() 
+0

我会测试,TY。我的朋友说问题是我没有更新命名空间(这是一个类,并且我见过的大多数答案只是生成了这些函数)。有一个关于更新命名空间的解决方案,这个命令空间复杂而且可读性强,从google动态声明函数python。我会明天检查并更新 – codyc4321

+0

好的!让我知道它是否有效,我想不出其他atm,因为它迟到了,但我认为只是在你的课堂上实现webdriver应该做到这一点。 –