将selenium对象引用传递给python中的函数

时间:2014-11-25 23:20:32

标签: python oop python-2.7 selenium

这里我有一个对象,我在其中实例化几个Selenium WebDrivers来控制Selenium Grid的一系列浏览器。

drivers = {
    0: webdriver.Remote('http://localhost:8080/wd/hub' , webdriver.DesiredCapabilities.FIREFOX.copy()),
    1: webdriver.Remote('http://localhost:8080/wd/hub' , webdriver.DesiredCapabilities.FIREFOX.copy()), 
    2: webdriver.Remote('http://localhost:8080/wd/hub' , webdriver.DesiredCapabilities.FIREFOX.copy()),
    3: webdriver.Remote('http://localhost:8080/wd/hub' , webdriver.DesiredCapabilities.FIREFOX.copy()),
    4: webdriver.Remote('http://localhost:8080/wd/hub' , webdriver.DesiredCapabilities.FIREFOX.copy())
}

我想做的是通过引用另一种方法传递这些驱动程序。像这样:

for driver in drivers:
    self.create_account(driver)

但是当我进入create_accounts方法时,我从Selenium收到以下错误:

driver.get("http://google.com")
AttributeError: 'int' object has no attribute 'get'

我认为这是因为我没有正确传递对象引用,并且它以某种方式传输为整数而不是具有我可以调用的方法的对象。我试图用Python做的事情是什么?是否有其他方式我应该这样做,或者我试图做的事情根本不可能?

2 个答案:

答案 0 :(得分:1)

您正在创建驱动程序字典。如果您只是将每个驱动程序分配给一个数字,那么最好创建一个驱动程序数组:

drivers = [
    webdriver.Remote('http://localhost:8080/wd/hub' , webdriver.DesiredCapabilities.FIREFOX.copy()),
    webdriver.Remote('http://localhost:8080/wd/hub' , webdriver.DesiredCapabilities.FIREFOX.copy()), 
    webdriver.Remote('http://localhost:8080/wd/hub' , webdriver.DesiredCapabilities.FIREFOX.copy()),
    webdriver.Remote('http://localhost:8080/wd/hub' , webdriver.DesiredCapabilities.FIREFOX.copy()),
    webdriver.Remote('http://localhost:8080/wd/hub' , webdriver.DesiredCapabilities.FIREFOX.copy())
]

然后你可以这样做:

for driver in drivers:

driver[4]

但是,如果您打算使用字典,那么您可以

for key, driver in drivers.items() 

如果你想要号码和司机,或者

for driver in drivers.values()

如果你只需要驱动程序。

答案 1 :(得分:0)

你应该迭代drivers.values()(或Python 2.x中的drivers.itervalues()):

for driver in drivers.values():

这会将driver分配给字典中的webdriver.Remote个实例,所有这些实例都有get方法。但是,您当前的代码是将driver分配给字典的整数键,因为迭代字典会产生其键。

以下是我上面所说的内容的演示:

>>> dct = {'a':1, 'b':2, 'c':3}
>>> for i in dct:  # Yields keys
...     i
...
'a'
'b'
'c'
>>> for i in dct.values():  # Yields values
...     i
...
1
2
3
>>>