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())
import nodriver as uc
from nodriver import cdp, loop
async def main():
config = uc.Config()
# browser_args = ['--disable-web-security', f"--proxy-server=http://127.0.0.1:10809"] # 完全禁用浏览器的同源策略
browser_args = [] # 完全禁用浏览器的同源策略
browser = await uc.start(browser_args=browser_args)
tab0 = browser.main_tab
tab0.add_handler(cdp.network.RequestWillBeSent, send_handler)
tab0.add_handler(cdp.network.ResponseReceived, receive_handler)
tab = await browser.get("https://docs.capsolver.com/en")
await tab.send(cdp.page.add_script_to_evaluate_on_new_document(
"""
Element.prototype._as = Element.prototype.attachShadow;
Element.prototype.attachShadow = function (params) {
return this._as({mode: "open"})
};
"""
))
for _ in range(10):
await tab.scroll_down(50)
await tab
# await tab.back()
all_urls = await tab.get_all_urls()
# for u in all_urls:
# print("downloading %s" % u)
# await tab.download_file(u)
await tab.sleep(5)
cookies = await browser.cookies.get_all()
print('cookies:', cookies)
browser.connection.mapper.clear()
await browser.cookies.clear()
# 解决普通iframe
for i in range(20): # 判断页面出现iframe
button_name = await tab.query_selector('iframe#tidio-chat-iframe')
print('button_name:', button_name)
if str(button_name).lower() == 'true':
break
await tab.sleep(1)
# 点击iframe 里面 button按钮
queryselector = await tab.select_all('button#button-body', timeout=15, include_frames=True)
print('queryselector:', queryselector)
if len(queryselector) == 1:
await queryselector[0].click()
await tab.sleep(2)
# 获取iframe对象
iframe_tab = await tab.select('iframe#tidio-chat-iframe', timeout=15)
for i in range(10):
placeholder = await iframe_tab.query_selector('div.message.message-operator.message-form')
print('attributes:', placeholder)
if placeholder:
break
await tab.sleep(2)
# 向iframe 下的input输入内容
placeholder2 = await iframe_tab.query_selector('input[placeholder="Your name..."]')
await placeholder2.send_keys('lw')
print('placeholder2:', placeholder2)
input('stop')
async def receive_handler(event: cdp.network.ResponseReceived):
# print('service_worker_response_source:', event.response.service_worker_response_source)
# print('service_worker_router_info:', event.response.service_worker_router_info)
# print('to_json:', event.response.to_json)
# print('url:', event.response.url)
# print('timing:', event.response.timing)
# # print('response:', dir(event.response))
# print('*'*100)
pass
async def send_handler(event: cdp.network.RequestWillBeSent):
r = event.request
s = f"{r.method} {r.url}"
for k, v in r.headers.items():
s += f"\n\t{k} : {v}"
if __name__ == "__main__":
loop().run_until_complete(main())