Нажатие на ссылку на основе частичного совпадения текста - PullRequest
2 голосов
/ 18 апреля 2011

Я использую Selenium 2 / Webdriver с python и хочу нажать на первую ссылку, которая начинается со строки.Вот код, который я придумал:

def click_link_partial(div_id, partial):
  linkdiv = driver.find_element_by_id(div_id)
  z = (a.click() for a in linkdiv.find_elements_by_tag_name('a') if a.text.startswith(partial))
  z.next()

Я не очень знаком с генераторами в Python.Почему a.click () не вызывается немедленно, вместо выполнения z.next ()?

Есть ли недостатки в использовании этого кода?

1 Ответ

2 голосов
/ 18 апреля 2011

Прежде всего, пожалуйста, ознакомьтесь с генераторами Python, они являются очень мощным инструментом в вашем арсенале Python.Отличное объяснение Томаса Воутерса можно найти, прочитав еще один вопрос: Для чего вы можете использовать функции генератора Python?

Когда вы закончите чтение, вы поймете, что генератор простодает вам возможность лениво оценивать выражения.

Связав эту часть информации с вашим кодом выше, вы обнаружите, что a.click() на самом деле не будет выполняться сразу, потому что ожидается, что вы итерируете по выражению генератора, которое вы создали.Вот почему вы должны выполнить z.next(), чтобы фактически вызвать метод click().

Если вы не хотите выдавать z.next(), и при условии, что вы просто хотите нажать на первую частично сопоставленную ссылку, выпереписал бы ваш код выше следующим образом:

def click_link_partial(div_id, partial):
  linkdiv = driver.find_element_by_id(div_id)
  for a in linkdiv.find_elements_by_tag_name('a'):
      if a.text.startswith(partial):
         a.click()
         break  # stop iterating over the partially matched elements.

Однако, если вы хотите нажать на все частично связанные элементы, вы должны удалить z.next() из вашего кода выше и вернуть выражение генераторадля использования во внешней функции / методе.Вот пример:

def click_link_partial(div_id, partial):
  linkdiv = driver.find_element_by_id(div_id)
  return (a for a in linkdiv.find_elements_by_tag_name('a') 
            if a.text.startswith(partial))

for matched_clickable_anchor in click_link_partial('#some-div-id', 'spam'):
    matched_clickable_anchor.click()  # do click
    # do something else.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...