nodriver 在切换到隐藏的iframe是有些麻烦的,并不能直接搜索到iframe
import json
from nodriver import start, cdp, loop
import nodriver as uc
async def switch_to_frame(browser, frame):
"""
change iframe
"""
iframe_tab: uc.Tab = next(
filter(
lambda x: str(x.target.target_id) == str(frame.frame_id), browser.targets
)
)
return iframe_tab
async def main():
browser_args = ['--disable-web-security']
browser = await uc.start(browser_args=browser_args)
tab = browser.main_tab
tab = await browser.get("http://www.yescaptcha.cn/auth/login")
for _ in range(10):
await tab.scroll_down(50)
await tab
await tab.sleep(15)
#解决普通iframe 直接可以搜索到iframe标签
# query_selector = await tab.select_all('button[class="widgetLabel moveFromRightLabel-enter-done"]', include_frames=True)
# print('query_selector:', query_selector)
# if len(query_selector) == 1:
# await query_selector[0].click()
#解决带有Cross-origin属性的隐藏iframe
recaptcha0 = await tab.select('iframe[title="reCAPTCHA"]')
print('recaptcha0:', recaptcha0.frame_id)
iframe_tab = await switch_to_frame(browser, recaptcha0)
print('iframe_tabwebsocket_url:', iframe_tab.websocket_url)
iframe_tab.websocket_url = iframe_tab.websocket_url.replace("iframe", "page")
button = await iframe_tab.select("span#recaptcha-anchor")
await button.click()
input('stop')
if name == "main":
loop().run_until_complete(main())