在Python中使用nodriver库与iframe内的按钮交互
我正在做一个自动化测试项目,使用的是一个叫做nodriver的库。目前,我在选择和点击一个在iframe里的按钮时遇到了困难,特别是一个reCAPTCHA验证码。
这是我正在尝试实现的函数的一部分:
async def click_captcha(tab):
# Trouver l'iframe du reCAPTCHA
iframe = await tab.select('iframe[title="reCAPTCHA"]') #It works
print("IFRAME............................;", iframe)
tab.switch_to.frame(iframe) # Here is the error
button_in_iframe = await tab.select('span[id="recaptcha-anchor"]')
await button_in_iframe.click()
return tab
async def main():
driver = await uc.start()
tab = await driver.get("https://mysuper-website.com")
tab = await click_captcha(tab)
我收到一个错误提示,说明Tab对象没有switch_to这个属性。我该如何正确切换到iframe中,并使用nodriver与里面的按钮进行交互呢?这个库有没有处理iframe的特定方法?
这个库的链接是:https://github.com/ultrafunkamsterdam/nodriver
我试着在这个库的代码里搜索,但没有找到什么有用的信息。
1 个回答
0
使用nodriver时,你不需要切换到iframe就能与其进行交互。如果在父文档中找不到你要搜索的文本或元素,或者你使用了多个元素选择器,nodriver的搜索方法会自动切换到iframe。
来自nodriver的说明文档:
智能元素查找,可以通过选择器或文本来查找,包括iframe中的内容。这也可以用作等待某个元素出现的条件,因为它会在找到之前不断重试。通过tab.find()进行单个元素的文本查找时,可以接受一个best_match标志,这样不会简单地返回第一个匹配项,而是会根据文本长度最接近的候选项进行匹配。
不过,目前这个功能并没有按预期工作。根据我的调试,nodriver确实尝试在iframe中查找元素,但iframe内部并没有返回任何元素,所以无法与里面的任何元素进行交互。这个项目的拥有者(Leon,也叫ultrafunkamsterdam)还没有完成这个项目,所以这个问题在未来的版本中应该会得到修复。你能做的就是耐心等待。