DrissionPage 多个页面间进行切换

# -*- coding: utf-8 -*-
import time
from DrissionPage import SessionPage
from DrissionPage import ChromiumPage, Chromium, ChromiumOptions


def judge_element_exist(page, js_path, type=1, params=None):
    # 判断标签是否存在
    if type == 1:
        # 元素路径需要双引号包裹
        js_path = js_path.replace('"', "'")
        if params:
            result = page.run_js(
                '''var temp = arguments[0].querySelector("%s");if(temp){return true}else{return false}''' % js_path,
                params)
        else:
            result = page.run_js(
                '''var temp = document.querySelector("%s");if(temp){return true}else{return false}''' % js_path)
    else:
        # 元素路径需要单引号包裹 模糊匹配
        js_path = js_path.replace("'", '"')
        if params:
            result = page.run_js(
                '''var temp = arguments[0].querySelector('%s'); if(temp){return true}else{return false}''' % js_path,
                params)
        else:
            result = page.run_js(
                '''var temp = document.querySelector('%s');if(temp){return true}else{return false}''' % js_path)
    return result


def run():
    # 创建页面对象
    co1 = ChromiumOptions().set_paths(local_port=19315)
    browser = ChromiumPage(addr_or_opts=co1)
    browser.set.window.show()   # 显示页面
    page = browser.latest_tab

    page.get('https://www.baidu.com')
    time.sleep(2)

    get_tab = browser.get_tab()
    print('get_tab:', get_tab)
    get_tabs = browser.get_tabs()
    print('get_tabs:', get_tabs)
    tabs_count = browser.tabs_count
    print('tabs_count:', tabs_count)
    tab_ids = browser.tab_ids
    print('tab_ids:', tab_ids)
    # 获取当前页面信息
    print('tab_id:', page.tab_id)
    print('title:', page.title)
    print('url:', page.url)

    input_exist = judge_element_exist(page, 'input#kw')
    print('input_exist:', input_exist)
    if input_exist:
        input1 = page.ele('css:input#kw')
        print('attrs:', input1.attrs)     # 获取标签的属性
        input1.clear()
        input1.input('python')

    # 判断元素是否隐藏
    disabled = page.run_js(
        '''var temp= document.querySelector('input#kw'); if(temp){return temp.disabled}else{return false}''')
    print('disabled:', disabled)
    
    submit1 = judge_element_exist(page, 'input#su')
    print('submit1:', submit1)
    if submit1:
        js_element_click(page, 'input#su')
    time.sleep(2)
    # 点击一个新页面
    divs1 = page.eles('xpath://div[@id="content_left"]//h3//a[@target="_blank"]')
    print('divs1:', len(divs1))
    divs1[0].click()
    time.sleep(2)
    # 焦点切换到新页面
    print('latest_tab:', browser.latest_tab.tab_id)
    browser.activate_tab(browser.latest_tab.tab_id)  # 焦点转换到最新页面
    page1 = browser.latest_tab  # 操作最新的页面
    print('*'*100)
    print('tab_id1:', page1.tab_id)
    print('title1:', page1.title)
    print('url1:', page1.url)
    # 焦点切换到新页面
    # page2 = browser.get_tab(url='wd=python')  # 返回到指定页面
    page2 = browser.get_tab(title='_百度搜索')
    browser.activate_tab(page2.tab_id)
    print('*' * 100)
    print('tab_id2:', page2.tab_id)
    print('title:', page2.title)
    print('url:', page2.url)
    print(browser.tab_ids)


if __name__ == '__main__':
    run()










解决iframe 


def run1():
    # shadow_root>iframe
    co1 = ChromiumOptions().set_paths(local_port=19315)
    browser = ChromiumPage(addr_or_opts=co1)
    browser.set.window.show()   # 显示页面
    page = browser.latest_tab
    page.get('https://www.metin2pserver.info/vote-guabi.htm')
    time.sleep(2)
    flag = False
    for i in range(15):
        disabled = page.run_js('''var temp= document.querySelector('div#RGIpp2'); if(temp){return true}else{return false}''')
        print('disabled:', disabled)
        if disabled:
            flag = True
            break
        else:
            time.sleep(1)
    if flag:
        div_shadow = page.ele('xpath://div[@id="RGIpp2"]/div/div')
        iframe = div_shadow.shadow_root.get_frame('t:iframe')
        shadow_root1 = iframe.ele('xpath://body')
        print(shadow_root1.inner_html)
        checkbox = shadow_root1.shadow_root.ele('xpath://input[@type="checkbox"]')
        print(checkbox.text)
        checkbox.click()


def run2():
    # general iframe
    co1 = ChromiumOptions().set_paths(local_port=19315)
    browser = ChromiumPage(addr_or_opts=co1)
    browser.set.window.show()   # show tab
    page = browser.latest_tab
    page.get('https://DrissionPage.cn/demos/iframe_diff_domain.html')
    time.sleep(2)
    iframe = page.get_frame('t:iframe')
    print(iframe)
    a_tag = iframe.ele('xpath://a[@id="ariaTipText"]')
    print(a_tag.attrs)

 



import time
from DrissionPage import Chromium, ChromiumOptions
import random


def judge_element_text(page, tag_path, text):
    # js 根据文本定位
    js0 = '''
    var temp = Array.from(document.querySelectorAll('%s')).find(el => el.textContent.includes('%s'));
    if(temp){return true}else{return false};
    ''' % (tag_path, text)
    result = page_run_js(page, js0)
    return result


def judge_element_exist(page, js_path, type=1, params=None):
    # 判断标签是否存在
    if type == 1:
        # 元素路径需要双引号包裹
        js_path = js_path.replace('"', "'")
        if params:
            result = page.run_js(
                '''var temp = arguments[0].querySelector("%s");if(temp){return true}else{return false}''' % js_path,
                params)
        else:
            result = page.run_js(
                '''var temp = document.querySelector("%s");if(temp){return true}else{return false}''' % js_path)
    else:
        # 元素路径需要单引号包裹 模糊匹配
        js_path = js_path.replace("'", '"')
        if params:
            result = page.run_js(
                '''var temp = arguments[0].querySelector('%s'); if(temp){return true}else{return false}''' % js_path,
                params)
        else:
            result = page.run_js(
                '''var temp = document.querySelector('%s');if(temp){return true}else{return false}''' % js_path)
    return result


def change_tab(browser, params):
    temp_tab_id = browser.latest_tab.tab_id   # 最后创建或最后被激活的页面
    print('temp_tab_id:', temp_tab_id)
    page = browser.get_tab(browser.latest_tab.tab_id)   # 最后创建或最后被激活的页面
    current_url = page.url
    print('current_url0:', current_url)
    if params in current_url:  # 当前页面满足条件
        return page
    flag = False
    for tab_id in browser.tab_ids:
        page = browser.get_tab(tab_id)
        if params in page.url:
            browser.activate_tab(page.tab_id)   # 页面焦点切换
            flag = True
            break
    if flag:   # 查询到满足条件
        print('current_url1:', page.url)
        return page
    else:   # 未查询到满足条件,返回原页面
        page = browser.get_tab(temp_tab_id)
        # browser.activate_tab(temp_tab_id)   # 页面焦点切换
        print('current_url2:', page.url)
        return page


def slide_data1(page):
    url = 'https://detail.1688.com/offer/643272204627.html'
    # url = 'https://www.1688.com/?at_iframe=1'
    page.get(url)
    # page.listen.start(url)
    time.sleep(5)
    page.set.load_mode.normal()
    # 解决滑动验证码
    if not judge_element_exist(page, 'span[id*="nc_1_n1z"]'):   # 模糊匹配
        return
    ele = page.wait.eles_loaded("x://span[contains(@id,'nc_1_n1z')]", timeout=20)
    if ele:
        ele = page.ele("#nc_1_n1t")
    time.sleep(3)
    ele.hover()
    page.actions.hold('#nc_1_n1z')
    page.actions.move(100, duration=random.random())
    page.actions.move(100, duration=1+random.random())
    page.actions.move(59, duration=2+random.random())


def page_ele(page, param, timeout=3, eles=False):
    for i in range(2):
        try:
            if eles:
                return page.eles(param, timeout=timeout)
            else:
                return page.ele(param, timeout=timeout)
        except Exception as e:
            print('error:', e)
            # if '与页面的连接已断开' in str(e):
            page.reconnect()    # 重新连接页面
            time.sleep(2)
    return None


def page_run_js(page, js, param=None):
    # if page.states.ready_state != 'complete':
    #     time.sleep(2.5)
    try:
        if param:
            result = page.run_js(js, param)
        else:
            result = page.run_js(js)
        return result
    except Exception as e:
        print(f'js执行失败: {e} js: {js}')
        print(page.url)
        print('ready_state:', page.states.ready_state)
        return None


def run():
    # 创建页面对象
    co1 = ChromiumOptions().set_paths(local_port=19315)
    browser = Chromium(addr_or_opts=co1)
    page = browser.latest_tab
    page = browser.get_tab()
    # page.set.window.hide()    # 最小化窗口
    time.sleep(2.5)
    page.set.window.show()      # 显示窗口
    print(page.rect.size)
    print(page.rect.window_size)
    # slide_data1(page) # 滑动滑块

    page = browser.get_tab(page.tab_id)
    page.get('https://www.baidu.com')
    print(page.states.ready_state)
    time.sleep(2)

    print(page.states.ready_state)
    page.set.window.size(1200, 1000)

    page.disconnect()   # 断开连接
    divs1 = page_ele(page, 'xpath://div[@id="content_left"]//h3//a[@target="_blank"]', eles=True)
    # divs1 = page.eles('xpath://div[@id="content_left"]//h3//a[@target="_blank"]')
    print('divs1:', len(divs1))
    # 某些操作后需要重新连接
    page.reconnect()

    print(page.rect.size)
    print(page.rect.window_size)

    page00 = browser.new_tab('chrome://downloads')
    time.sleep(5)
    page02 = browser.latest_tab
    print(page02.url)
    # 关闭弹窗
    page_run_js(page00, '''var tem=document.querySelector("div[role='dialog']");if(tem){tem.remove()}''')
    print(page00.url)
    # 关闭新标签页
    try:
        page00.close()
    except:
        pass

    # 获取最新的页面
    page = browser.latest_tab
    # page = change_tab(browser, params='baidu.com')
    # 获取当前页面信息
    print('tab_id:', page.tab_id)
    print('title:', page.title)
    print('url:', page.url)
    input_exist = judge_element_exist(page, 'input#kw')
    print('input_exist:', input_exist)
    if input_exist:
        input1 = page.ele('css:input#kw')
        print('attrs:', input1.attrs)     # 获取标签的属性
        input1.clear()
        input1.input('python')

    # 判断元素是否隐藏
    disabled = page_run_js(page,
        '''var temp= document.querySelector('input#kw'); if(temp){return temp.disabled}else{return false}''')
    print('disabled:', disabled)

    submit1 = judge_element_exist(page, 'input#su')
    print('submit1:', submit1)
    if submit1:
        page_ele(page, 'css:input#su').click()

    time.sleep(2)
    # 点击一个新页面
    divs1 = page_ele(page, 'xpath://div[@id="content_left"]//h3//a[@target="_blank"]', eles=True)
    print('divs1:', len(divs1))
    for i in divs1:
        i.click()
        time.sleep(2.5)
        print('等待页面跳转')
        page.wait.load_start()  # 等待页面跳转
        page8 = browser.latest_tab   # 切换到新页面
        print(page8.url)
        page8.close()
    print(page.url)
    print('*' * 100)


if __name__ == '__main__':
    run()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值