pyefun.seleniumUtil.seleniumUtil 源代码

"""
*******************
浏览器类
*******************

.. contents:: 目录


.. Hint::
    需要安装 selenium chrome浏览器或者Firefox浏览器

    本地调试下需要安装 chrome浏览器 chromedriver驱动 或者 Firefox geckodriver驱动

    window macos ubuntu  使用 浏览器初始化本地环境() 就可以自动检测驱动和自动下载配置

    使用 docker 部署远程浏览器 无需安装驱动

    部署时建议使用docker部署远程浏览器

安装 selenium
================

``pip install selenium``


chromedriver 驱动下载
================

https://chromedriver.chromium.org/

https://chromedriver.storage.googleapis.com/index.html?path=90.0.4430.24/

Firefox 驱动下载
================

https://github.com/mozilla/geckodriver/releases

docker部署远程浏览器
================

linux
-------------------

    ``docker run --name chrome -d -p 4444:4444 -p 5900:5900 -v /dev/shm:/dev/shm selenium/standalone-chrome-debug:3.141.59-20210422``

window
-------------------

    ``docker run --name chrome -d -p 4444:4444 -p 5900:5900 selenium/standalone-chrome-debug:3.141.59-20210422``

vpc连接远程桌面
-------------------

VNC Viewer
https://www.realvnc.com/en/connect/download/viewer/

127.0.0.1:5900 即可连接至远程桌面


.. image:: /_static/vnc_viewer.png



.. literalinclude:: ../../../pyefun/seleniumUtil/seleniumUtil_test.py
    :language: python
    :caption: 代码示例
    :linenos:


"""

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.common.by import By  # 等待页面加载延时模块
from selenium.webdriver.support import expected_conditions as EC  # 等待页面加载延时模块

from pyefun import *
import requests
from pyefun.模块.通用实用函数 import *
from pyefun.编码解码.zip解压缩 import *

键盘_F1 = '\ue031'
键盘_F2 = '\ue032'
键盘_F3 = '\ue033'
键盘_F4 = '\ue034'
键盘_F5 = '\ue035'
键盘_F6 = '\ue036'
键盘_F7 = '\ue037'
键盘_F8 = '\ue038'
键盘_F9 = '\ue039'
键盘_F10 = '\ue03a'
键盘_F11 = '\ue03b'
键盘_F12 = '\ue03c'

键盘_META = '\ue03d'
键盘_COMMAND = '\ue03d'
键盘_ESCAPE = '\ue00c'
键盘_SPACE = '\ue00d'
键盘_PAUSE = '\ue00b'

键盘_向左 = '\ue012'
键盘_向上 = '\ue013'
键盘_向右 = '\ue014'
键盘_向下 = '\ue015'

键盘_INSERT = '\ue016'
键盘_DELETE = '\ue017'
键盘_PAGE_UP = '\ue00e'
键盘_PAGE_DOWN = '\ue00f'
键盘_END = '\ue010'
键盘_HOME = '\ue011'
键盘_ALT = '\ue00a'
键盘_CTRL = '\ue009'
键盘_退格 = '\ue003'
键盘_空格 = '\ue00d'
键盘_TAB = '\ue004'
键盘_ESC = '\ue00c'
键盘_回车 = '\ue007'
键盘_SHIFT = '\ue008'


[文档]def 浏览器初始化本地环境(): """ .. Hint:: 自动检测环境 自动下载驱动 如果使用远程浏览器则无需安装驱动 也无需调用本函数 """ if 系统_是否为window系统(): 返回内容 = 运行("chromedriver -v") if 判断文本(返回内容, ["ChromeDriver"]) == False: 驱动路径 = "C:/Windows/chromedriver.exe" if 文件是否存在(驱动路径) == False: 保存路径 = 取运行目录() + "/chromedriver.zip" 下载地址 = "https://chromedriver.storage.googleapis.com/90.0.4430.24/chromedriver_win32.zip" print("chromedriver 驱动不存在 正在自动下载 %s 保存路径为:%s" % (下载地址, 保存路径)) 下载文件(下载地址, 保存路径) 解压目录 = "C:/Windows" zip解压(保存路径, 解压目录) print("chromedriver 解压至:%s" % (驱动路径)) 文件_删除(保存路径) if 系统_是否为mac系统(): 返回内容 = 运行("chromedriver -v") if 判断文本(返回内容, ["ChromeDriver"]) == False: 驱动路径 = "/usr/local/bin/chromedriver" if 文件是否存在(驱动路径) == False: 保存路径 = 取运行目录() + "/chromedriver.zip" 下载地址 = "https://chromedriver.storage.googleapis.com/90.0.4430.24/chromedriver_mac64.zip" print("chromedriver 驱动不存在 正在自动下载 %s 保存路径为:%s" % (下载地址, 保存路径)) 下载文件(下载地址, 保存路径) 解压目录 = "/usr/local/bin/" zip解压(保存路径, 解压目录) print("chromedriver 解压至:%s" % (驱动路径)) 文件_删除(保存路径) 文件_修改权限(驱动路径, stat.S_IRWXU) if 系统_是否为linux系统(): 返回内容 = 运行("chromedriver -v") if 判断文本(返回内容, ["ChromeDriver"]) == False: 驱动路径 = "/usr/local/bin/chromedriver" if 文件是否存在(驱动路径) == False: 保存路径 = 取运行目录() + "/chromedriver.zip" 下载地址 = "https://chromedriver.storage.googleapis.com/90.0.4430.24/chromedriver_linux64.zip" print("chromedriver 驱动不存在 正在自动下载 %s 保存路径为:%s" % (下载地址, 保存路径)) 下载文件(下载地址, 保存路径) 解压目录 = "/usr/local/bin/" zip解压(保存路径, 解压目录) print("chromedriver 解压至:%s" % (驱动路径)) 文件_删除(保存路径) 文件_修改权限(驱动路径, stat.S_IRWXU)
[文档]class 浏览器类():
[文档] def 远程浏览器是否就绪(self, 远程浏览器地址="http://127.0.0.1:4444/wd/hub"): """ while 浏览器.远程浏览器是否就绪(远程浏览器地址) == False: 延时(1) print("浏览器未就绪") """ try: data = requests.get(远程浏览器地址 + "/status") json = data.json() ready = json['value']['ready'] except: return False return ready
[文档] def 获取远程chrome(self, server_url="http://127.0.0.1:4444/wd/hub"): capabilities = DesiredCapabilities.CHROME.copy() capabilities['goog:chromeOptions'] = {"args": ["--headless"]} driver = webdriver.Remote( command_executor=server_url, desired_capabilities=capabilities ) self.浏览器 = driver return driver
[文档] def 获取本地chrome(self, 驱动路径='chromedriver', ChromeOptions=webdriver.ChromeOptions()): # opt = webdriver.ChromeOptions() # # opt.add_argument('--headless') # opt.add_argument('--disable-gpu') # opt.add_argument("blink-settings=imagesEnabled=false") # opt.add_argument( # "user-agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'") driver = webdriver.Chrome(驱动路径, options=ChromeOptions) self.浏览器 = driver return driver
[文档] def 获取本地Firefox(self): opt = webdriver.FirefoxOptions() opt.add_argument('--headless') opt.add_argument('--disable-gpu') opt.add_argument("blink-settings=imagesEnabled=false") opt.add_argument( "user-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'") driver = webdriver.Firefox(options=opt) self.浏览器 = driver return driver
[文档] def 打开chrome(self, 驱动路径='chromedriver', 无痕模式=True, 无头模式=False, 隐藏自动化提示=True, 隐藏滚动条=False, 禁止加载图片=False, 禁用插件=False, 禁止Javascript=False, 禁用JAVA=False, 禁止密码保存提示=True, 禁用弹窗=False, 禁止策略化=False, 初始运行=False, 沙盒运行=True, user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36', 代理='', 编码='lang=zh_CN.UTF-8', 禁止使用GPU=False, 谷歌浏览器路径=''): '代理格式:127.0.0.1:8888 带账号密码验证的自行百度修改' chrome_options = webdriver.ChromeOptions() if 无痕模式: chrome_options.add_argument('--incognito') if 无头模式: chrome_options.add_argument('--headless') if 隐藏自动化提示: chrome_options.add_experimental_option("excludeSwitches", ['enable-automation']) if 隐藏滚动条: chrome_options.add_argument('--hide-scrollbars') if 禁止加载图片: chrome_options.add_argument('blink-settings=imagesEnabled=false') if 禁用插件: chrome_options.add_argument('--disable-plugins') if 禁止Javascript: chrome_options.add_argument('--disable-javascript') if 禁止密码保存提示: prefs = {} prefs["credentials_enable_service"] = False prefs["profile.password_manager_enabled"] = False chrome_options.add_experimental_option("prefs", prefs) if 禁止策略化: chrome_options.add_argument('--disable-infobars') if 禁用弹窗: chrome_options.add_argument('--disable-popup-blocking') if 禁用JAVA: chrome_options.add_argument('–disable-java') if not 沙盒运行: chrome_options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错 if user_agent: chrome_options.add_argument('User-Agent=' + user_agent) if 编码: chrome_options.add_argument(编码) if 禁止使用GPU: chrome_options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug if 代理: chrome_options.add_argument('--proxy-server=http://' + 代理) if 谷歌浏览器路径: chrome_options.binary_location = 谷歌浏览器路径 if 初始运行: chrome_options.add_argument('–first run') self.获取本地chrome(驱动路径, chrome_options) return True
[文档] def 隐藏特征(self): folder = os.path.dirname(os.path.abspath(__file__)) stealth = os.path.join(folder, "stealth.min.js") js = 读入文本(stealth) self.浏览器.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": js })
[文档] def 下载隐藏特征文件(self): folder = os.path.dirname(os.path.abspath(__file__)) stealth = os.path.join(folder, "stealth.min.js") 下载文件("https://raw.githubusercontent.com/requireCool/stealth.min.js/main/stealth.min.js", stealth)
[文档] def 浏览网页(self, URL地址, 隐藏Navigator=True): """ 浏览指定网页。本命令为初级对象成员命令。 """ self.浏览器.get(URL地址) if 隐藏Navigator: script = "Object.defineProperty(navigator,'webdriver',{get: ()=> false,});" self.浏览器.execute_script(script) return True
[文档] def 等待元素加载(self, By元素类型=0, 元素名称="", 等待秒数=60): """成功返回真,失败返回假 ,By元素类型参数0是css_selector 谷歌直接复制 1 是id属性 2是name属性, 3 是链接名称 4是xpath属性 5是class_name属性 6是tag_name属性 7,模糊 链接名称""" if By元素类型 == 0: a = By.CSS_SELECTOR elif By元素类型 == 1: a = By.ID elif By元素类型 == 2: a = By.NAME elif By元素类型 == 3: a = By.LINK_TEXT elif By元素类型 == 4: a = By.XPATH elif By元素类型 == 5: a = By.CLASS_NAME elif By元素类型 == 6: a = By.TAG_NAME elif By元素类型 == 7: a = By.PARTIAL_LINK_TEXT try: Wait(self.浏览器, 等待秒数).until(EC.presence_of_element_located((a, 元素名称))) # 等待页面id为 password 是否加载 完成 return True except Exception as cuowu: return False
[文档] def 等待元素显示(self, 等待时间=5, className=""): try: WebDriverWait(self.浏览器, 等待时间, 0.5, ignored_exceptions=TimeoutException).until( lambda x: x.find_element_by_class_name(className).is_displayed()) except: return False return True
[文档] def 取页面标题(self): return self.浏览器.title
[文档] def 取页面链接(self): return self.浏览器.current_url
[文档] def 取页面源码(self): return self.浏览器.page_source
[文档] def 关闭当前页面(self): '如果只有一个页面标签则会关闭浏览器' self.浏览器.close() return True
[文档] def 退出(self): """ 关闭浏览器 """ self.浏览器.quit() return True
[文档] def 全屏(self): '等于按了F11 浏览器窗口全屏显示' self.浏览器.fullscreen_window() return True
[文档] def 置浏览器宽度高度(self, 宽度, 高度): self.浏览器.set_window_size(宽度, 高度) return True
[文档] def 后退(self): '控制浏览器后退' self.浏览器.back() return True
[文档] def 前进(self): '控制浏览器前进' self.浏览器.forward() return True
[文档] def 刷新页面(self): self.浏览器.refresh() return True
[文档] def 进入Frame页面(self, Frame标识): "默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性可以通过定位获取的标识直接传入" self.浏览器.switch_to.frame(Frame标识) return True
[文档] def 置最外层Frame框架(self): self.浏览器.switch_to.frame_content()
[文档] def 置上一层Frame框架(self): self.浏览器.switch_to.partent_frame()
[文档] def 退出Frame页面(self): self.浏览器.switch_to.default_content() return True
[文档] def 取所有页面句柄(self): '返回所有窗口的句柄到当前会话' return self.浏览器.window_handles
[文档] def 取当前页面句柄(self): '获得当前窗口句柄' return self.浏览器.current_window_handle
[文档] def 切换页面(self, 页面句柄): '用于不同窗口的切换' self.switch_to.window(页面句柄) return True
[文档] def 提示框同意(self): '接受现有警告框' self.浏览器.switch_to.alert.accept() return True
[文档] def 提示框取消(self): '解散现有警告框' self.浏览器.switch_to.alert.dismiss() return True
[文档] def 提示框发送文本(self, 内容): '发送文本至警告框。keysToSend:将文本发送至警告框' self.浏览器.switch_to.alert.send_keys(内容) return True
[文档] def 提示框取文本(self): '返回 alert/confirm/prompt 中的文字信息' return self.浏览器.switch_to.alert.text
[文档] def 提示框置焦点(self): '返回 alert/confirm/prompt 中的文字信息' return self.浏览器.switch_to.alert()
[文档] def 取元素从id(self, id): '通过元素id定位,匹配多个则返回对象列表' 结果 = self.浏览器.find_elements_by_id(id) if len(结果) == 0: return False return 浏览器元素操作(self.浏览器, 结果[0])
[文档] def 取元素从name(self, name): '通过元素name定位,匹配多个则返回对象列表' return [浏览器元素操作(self.浏览器, x) for x in self.浏览器.find_elements_by_name(name)]
[文档] def 取元素从xpath(self, xpath): '通过xpath表达式定位,匹配多个则返回对象列表' return [浏览器元素操作(self.浏览器, x) for x in self.浏览器.find_elements_by_xpath(xpath)]
[文档] def 取元素从tag_name(self, tagname): '通过标签定位,匹配多个则返回对象列表' return [浏览器元素操作(self.浏览器, x) for x in self.浏览器.find_elements_by_tag_name(tagname)]
[文档] def 取元素从class_name(self, name): '通过类名进行定位,匹配多个则返回对象列表' return [浏览器元素操作(self.浏览器, x) for x in self.浏览器.find_elements_by_class_name(name)]
[文档] def 取元素从css_selector(self, css): '通过css选择器进行定位,匹配多个则返回对象列表' return [浏览器元素操作(self.浏览器, x) for x in self.浏览器.find_elements_by_css_selector(css)]
[文档] def 最大化(self): "浏览器窗口最大化" self.浏览器.maximize_window() return True
[文档] def 最小化(self): "浏览器窗口最小化" self.浏览器.minimize_window() return True
[文档] def 取名称(self): "查看浏览器的名字" return self.浏览器.name
[文档] def 取窗口坐标(self): "获取当前窗口的坐标" return self.浏览器.get_window_position()
[文档] def 取窗口矩形(self): "获取窗口的x,y坐标以及当前窗口的高度和宽度" return self.浏览器.get_window_rect()
[文档] def 取窗口宽度高度(self): "获取当前窗口的尺寸" return self.浏览器.get_window_size()
[文档] def 取所有Cookie(self): '获得所有cookie信息' return self.浏览器.get_cookies()
[文档] def 取指定Cookie(self, name): '返回字典的key为“name”的cookie信息' return self.浏览器.get_cookie(name)
[文档] def 添加Cookie(self, cookie_dict): '添加cookie。“cookie_dict”指字典对象,必须有name 和value 值' self.浏览器.add_cookie(cookie_dict) return True
[文档] def 删除指定Cookie(self, name): '删除cookie信息。“name”是要删除的cookie的名称' self.浏览器.delete_cookie(name) return True
[文档] def 删除所有Cookie(self): '删除所有cookie信息' self.浏览器.delete_all_cookies() return True
[文档] def 运行JS(self, *args): '执行js代码,算加密需要自己声明调用的对象' return self.浏览器.execute_script(*args)
[文档] def 运行JS异步(self, *args): '执行js代码' return self.浏览器.execute_async_script(*args)
[文档] def 新建页面(self, URL): '通过javascript打开新页面' js = "window.open('{}')".format(URL) self.浏览器.execute_script(js) return True
[文档] def 置滚动条位置(self, 横向=0, 纵向=0): '通过javascript设置浏览器窗口的滚动条位置' js = "window.scrollTo({},{});".format(横向, 纵向) self.浏览器.execute_script(js) return True
[文档] def 滚动条靠左(self): '通过javascript设置浏览器窗口的滚动条位置' js = "var q=document.documentElement.scrollLeft=0" self.浏览器.execute_script(js) return True
[文档] def 滚动条靠右(self): '通过javascript设置浏览器窗口的滚动条位置' js = "var q=document.documentElement.scrollLeft=10000" self.浏览器.execute_script(js) return True
[文档] def 滚动条靠顶(self): '通过javascript设置浏览器窗口的滚动条位置' js = "var q=document.documentElement.scrollTop=0" self.浏览器.execute_script(js) return True
[文档] def 滚动条靠底(self): '通过javascript设置浏览器窗口的滚动条位置' js = "var q=document.documentElement.scrollTop=10000" self.浏览器.execute_script(js) return True
[文档] def 窗口截图保存(self, 保存地址): '将当前窗口的屏幕快照保存到PNG图像文件中' self.浏览器.save_screenshot(保存地址) return True
[文档] def 截图保存(self, 保存地址): '用于截取当前窗口,并把图片保存到本地' self.浏览器.get_screenshot_as_file(保存地址) return True
[文档] def 截图base64(self): '以base64编码的字符串获取当前窗口的屏幕快照' return self.浏览器.get_screenshot_as_base64()
[文档] def 截图png(self): '以二进制数据获取当前窗口的屏幕快照。' return self.浏览器.get_screenshot_as_png()
[文档] def 置页面超时时间(self, 秒数): '设置等待页面加载完成的时间' self.浏览器.set_page_load_timeout(秒数) return True
[文档] def 置JS超时时间(self, 秒数): '设置脚本在执行过程中应等待的时间' self.浏览器.set_script_timeout(秒数) return True
[文档] def 置浏览器位置(self, 左边=None, 顶边=None, 宽度=None, 高度=None): '设置窗口的x,y坐标以及当前窗口的高度和宽度。' self.浏览器.set_window_rect(左边, 顶边, 宽度, 高度) return True
[文档] def 鼠标抬起(self): '释放按住的鼠标键' ActionChains(self.浏览器).release().perform() return True
[文档]class 浏览器元素操作(): def __init__(self, 浏览器, 元素): self.元素 = 元素 self.浏览器 = 浏览器
[文档] def 清空(self): self.元素.clear() return True
[文档] def 输入(self, *args): '模拟按键输入,将密钥发送到当前的焦点元素,包括上传文件可以直接发送文件路径,可使用 键盘_* ,如 按键_输入(键盘_CTRL,"a") 即为全选' self.元素.send_keys(*args) return True
[文档] def 键盘指定输入(self, 键值): '将键发送到元素,可以使用 键盘_*' ActionChains(self.浏览器).send_keys_to_element(self.元素, 键值).perform() return True
[文档] def 点击(self): self.元素.click() return True
[文档] def 提交表单(self): '查找到表单(from)直接调用submit即可' self.元素.submit() return True
[文档] def 取属性值(self, 属性名称): '获取元素属性值,如:value,str,img等属性' return self.元素.get_attribute(属性名称)
[文档] def 取CSS属性值(self, 属性名称): '获取CSS属性值' return self.元素.value_of_css_property(属性名称)
[文档] def 取坐标(self): return self.元素.location
[文档] def 取宽度高度(self): return self.元素.size
[文档] def 是否显示可见(self): '判断元素是否显示' return self.元素.is_displayed()
[文档] def 是否选中(self): '判断元素是否选中状态' return self.元素.is_selected()
[文档] def 是否启用(self): '判断元素是否是否启用' return self.元素.is_enabled()
[文档] def 取文本(self): '获取文本' return self.元素.text
[文档] def 取源码(self): '获取文本' return self.元素.get_attribute("innerHTML")
[文档] def 取标签名称(self): '返回元素的tagName' return self.元素.tag_name
[文档] def 鼠标悬停(self): '执行鼠标悬停操作,一些网页鼠标悬停后才会加载下拉列表' ActionChains(self.浏览器).move_to_element(self.元素).perform() return True
[文档] def 鼠标右键按下(self): ActionChains(self.浏览器).context_click(self.元素).perform() return True
[文档] def 鼠标双击(self): ActionChains(self.浏览器).double_click(self.元素).perform() return True
[文档] def 鼠标左键按住(self): '按下鼠标左键在一个元素上' ActionChains(self.浏览器).click_and_hold(self.元素).perform() return True
[文档] def 鼠标拖动(self, 目标标识): '鼠标拖动(d.标识)' ActionChains(self.浏览器).drag_and_drop(self.元素, 目标标识).perform() return True
[文档] def 鼠标拖动距离(self, X偏移量, Y偏移量): '然后移至目标偏移量并释放鼠标按钮' ActionChains(self.浏览器).drag_and_drop_by_offset(self.元素, X偏移量, Y偏移量).perform() return True
[文档] def 鼠标原地偏移(self, X偏移量, Y偏移量): '将鼠标移动到当前鼠标位置的偏移处' ActionChains(self.浏览器).move_by_offset(X偏移量, Y偏移量).perform() return True
[文档] def 鼠标移到元素中间(self): '将鼠标移到元素的中间' ActionChains(self.浏览器).move_to_element().perform() return True
[文档] def 鼠标移动(self, X偏移量, Y偏移量): '将鼠标移动指定元素的偏移量' ActionChains(self.浏览器).move_to_element_with_offset(self.元素, X偏移量, Y偏移量).perform() return True
[文档] def 鼠标抬起(self): '释放元素上按住的鼠标键' ActionChains(self.浏览器).release(self.元素).perform() return True
[文档] def 按下全选(self): self.元素.send_keys(键盘_CTRL, 'a') return True
[文档] def 按下复制(self): self.元素.send_keys(键盘_CTRL, 'c') return True
[文档] def 按下剪切(self): self.元素.send_keys(键盘_CTRL, 'x') return True
[文档] def 按下粘贴(self): self.元素.send_keys(键盘_CTRL, 'v') return True
[文档] def 下拉框选择值(self, value): 'select标签的value属性的值' Select(self.元素).select_by_value(value) return True
[文档] def 下拉框选择索引(self, id): '下拉框的索引' Select(self.元素).select_by_index(id) return True
[文档] def 下拉框选择文本(self, text): '下拉框的文本值' Select(self.元素).select_by_visible_text(text) return True
[文档] def 下拉框全部取消选中(self): Select(self.元素).deselect_all() return True
[文档] def 下拉框取消选中索引(self, id): Select(self.元素).deselect_by_index(id) return True
[文档] def 下拉框取消选中值(self, value): Select(self.元素).deselect_by_value(value) return True
[文档] def 下拉框取消选中文本(self, text): Select(self.元素).deselect_by_visible_text(text) return True
[文档] def 下拉框取全部选中项(self): '返回属于此选择标记的所有选择的选项的列表' return Select(self.元素).all_selected_options
[文档] def 下拉框取选中项(self): '该选择标记中的第一个选择的选项(或正常选择中的当前选择的选项)' return Select(self.元素).first_selected_option
[文档] def 下拉框取列表项(self): '返回属于该选择标签的所有选项的列表' return Select(self.元素).options
[文档] def 取矩形(self): return self.元素.rect
[文档] def 截图保存(self, 文件名): '将当前元素的屏幕快照保存到PNG图像文件中' self.元素.screenshot(文件名) return True
[文档] def 截图base64(self): '以base64编码字符串的形式获取当前元素的屏幕快照' return self.元素.screenshot_as_base64
[文档] def 截图png(self): '以二进制数据获取当前元素的屏幕截图' return self.元素.screenshot_as_png