2014-11-25 4 views
0

Здесь у меня есть объект, в котором я создаю несколько Selenium WebDrivers для управления серией браузеров из Selenium Grid.Передача ссылки на объект selenium на функцию в python

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:

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

Я предполагаю, что это потому, что я не передавая ссылку на объект должным образом, и его так или иначе передавая как целое число, а не объект с методами, которые я могу вызвать. Я пытаюсь сделать это на Python? Есть ли другой способ, которым я должен это делать, или это то, что я пытаюсь сделать, просто невозможно?

ответ

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

если вы просто нужен драйвер.

0

Вы должны быть итерация drivers.values() (или drivers.itervalues() в Python 2.x):

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 
>>> 
Смежные вопросы