我正在使用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()执行时调用?
使用此代码有什么缺点吗?
答案 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.
希望这有帮助!