单击基于部分文本匹配的链接

时间:2011-04-18 15:51:00

标签: python selenium-webdriver

我正在使用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 个答案:

答案 0 :(得分:2)

首先,请熟悉Python的生成器,它们是Python工具库中非常强大的工具。通过阅读另一个问题可以找到Thomas Wouters的一个很好的解释:What can you use Python generator functions for?

一旦你完成阅读,你就会意识到一个生成器只是让你能够懒惰地评估表达式。

将这条信息与上面的代码相关联,您会发现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.

希望这有帮助!