这里我有一个对象,我在其中实例化几个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做的事情是什么?是否有其他方式我应该这样做,或者我试图做的事情根本不可能?
答案 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
>>>