根据部分文本匹配点击链接

2 投票
1 回答
2504 浏览
提问于 2025-04-16 15:58

我正在用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.

希望这对你有帮助!

撰写回答