根据部分文本匹配点击链接
我正在用Python的Selenium 2/Webdriver,想要点击第一个以某个字符串开头的链接。以下是我写的代码:
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
首先,请你了解一下Python的生成器,它们是你在Python编程中非常强大的工具。你可以通过阅读另一个问题,找到Thomas Wouters的精彩解释: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.
希望这对你有帮助!