Python / selenium — найдите элементы «По» — укажите стратегию поиска с переменной?

#python #selenium

#python #селен

Вопрос:

Создав браузер selenium и получив веб-страницу, это работает нормально:

 ...
if selenium_browser.find_element(By.ID, 'id_name'):
    print "found"
...
  

учитывая такой кортеж:

 tup = ('ID', 'id_name')
  

Я хотел бы иметь возможность находить такие элементы, как это:

 if selenium_browser.find_element(By.tup[0], tup[1]):
  

но я получаю эту ошибку

 AttributeError: type object 'By' has no attribute 'tup'
  

Как я могу это сделать без необходимости писать:

 if tup[0] == 'ID':
    selenium_browser.find_element(By.ID, tup[1])
    ...
elif tup[0] == 'CLASS_NAME':
    selenium_browser.find_element(By.CLASS_NAME, tup[1])
    ...
elif tup[0] == 'LINK_TEXT':
    etc etc
  

http://selenium-python.readthedocs.io/api.html ?выделите = #module-selenium.webdriver.common.by

Ответ №1:

Если вы хотите напрямую предоставить кортеж find_element , добавьте * впереди:

 locator = (By.ID, 'id')
element = driver.find_element(*locator)
  

Или с помощью метода, представленного в виде строки:

 locator = ('ID', 'id_name')
driver.find_element(getattr(By, locator[0]), locator[1])
  

Ответ №2:

Ваш синтаксис отключен.

В документах говорится, что это должно использоваться как таковое: find_element(by='id', value=None)

Поэтому вместо

 if selenium_browser.find_element(By.tup[0], tup[1]):
  

Вы должны сделать

 if selenium_browser.find_element(tup[0], tup[1]):
#or
if selenium_browser.find_element(by=tup[0], value=tup[1]):
  

Вам может понадобиться или не понадобиться вводить нижний регистр by элемента, т.Е. tup[0].lower()