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