nodriver 切换普通的iframe和隐藏的iframe

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())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值