Selenium 常用API大全(一篇就够)

2023-05-16

Selenium Crawl API(一篇就够)

万字长文整理不易,希望对各位有所帮助,欢迎大家一键三连,点赞收藏加关注。同时也欢迎大家交流分享,共同学习互相进步!

文章目录

  • Selenium Crawl API(一篇就够)
    • Selenium 常用方法
    • 初始化
    • 常用的操作
    • Chrome_Options 与 option区别
    • 标签切换
    • 句柄
    • 清除浏览器窗口
    • 自动向下滑动
    • 上传图片操作
    • 鼠标操作
    • 键盘操作
    • 等待直到
    • 二次截图
    • `Xpath解析`
    • `Xpath难点`
    • Chrome 识别标志
    • Selenium 键盘操作
    • Selenium 注意问题

Selenium 常用方法

  • 使用selenium操作时需要时刻模拟认为的操作行为方式
    • 比如:登录等需要多少秒,最好具体到每一小步

初始化

self.option = webdriver.ChromeOptions()
self.option.add_experimental_option('excludeSwitches', ['enable-automation'])
self.driver = webdriver.Chrome(chrome_options=self.option)
# self.driver.maximize_window()
from selenium import webdriver

chrome_options=webdriver.ChromeOptions() # 设置谷歌浏览器的一些选项
chrome_options.add_argument('lang=zh_CN.UTF-8') #设置编码格式
                            #模拟移动设备   (移动版网站的反爬虫的能力比较弱)   模拟iPhone6
chrome_options.add_argument('user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"')

chrome_options.add_argument('--no-sandbox')  #取消沙盒模式,解决DevToolsActivePort文件不存在的报错
chrome_options.add_argument('--disable-gpu')  #谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('--disable-dev-shm-usage')  #克服有限的资源问题  【但是用于Linux系统】
chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败

proxy='222.221.11.119:3128'
chrome_options.add_argument('--proxy-server=http://'+proxy)  #设置代理
driver=webdriver.Chrome(executable_path='C:\\Users\Administrator\Anaconda3\Scripts\chromedriver.exe',chrome_options=chrome_options)
driver.get('http://www.baidu.com')
#print(driver.page_source) #打印源码
print(len(driver.page_source)) #744016

常用的操作

  1. driver.page_source 当前标签页浏览器渲染之后的网页源代码
  2. driver.current_url 当前标签页的url
  3. driver.close() 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
  4. driver.quit() 关闭浏览器
  5. driver.forward() 页面前进
  6. driver.back() 页面后退
  7. driver.screen_shot(img_name) 页面截图
  8. driver.execute_script(“window.scrollTo(0,document.body.scrollHeight);”) 滑动到底部
  9. driver.send_keys() 输入
  10. driver.clear() 清楚

Chrome_Options 与 option区别

  • Chrome_Options

    # selenium启动配置参数接收是ChromeOptions类
    from selenium import webdriver
    option = webdriver.ChromeOptions()
    
    # 添加UA
    options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')
    
    # 指定浏览器分辨率
    options.add_argument('window-size=1920x3000') 
    
    # 谷歌文档提到需要加上这个属性来规避bug
    chrome_options.add_argument('--disable-gpu') 
    
     # 隐藏滚动条, 应对一些特殊页面
    options.add_argument('--hide-scrollbars')
    
    # 不加载图片, 提升速度
    options.add_argument('blink-settings=imagesEnabled=false') 
    
    # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
    options.add_argument('--headless') 
    
    # 以最高权限运行
    options.add_argument('--no-sandbox')
    
    # 手动指定使用的浏览器位置
    options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" 
    
    #添加crx插件
    option.add_extension('d:\crx\AdBlock_v2.17.crx') 
    
    # 禁用JavaScript
    option.add_argument("--disable-javascript") 
    
    # 设置开发者模式启动,该模式下webdriver属性为正常值
    options.add_experimental_option('excludeSwitches', ['enable-automation']) 
    
    # 禁用浏览器弹窗
    prefs = {  
        'profile.default_content_setting_values' :  {  
            'notifications' : 2  
         }  
    }  
    options.add_experimental_option('prefs',prefs)
    
    
    driver=webdriver.Chrome(chrome_options=chrome_options)
    
  • 其他配置项目参数

    –user-data-dir=”[PATH]” 
    # 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区
    
      –disk-cache-dir=”[PATH]“ 
    # 指定缓存Cache路径
    
      –disk-cache-size= 
    # 指定Cache大小,单位Byte
    
      –first run 
    # 重置到初始状态,第一次运行
    
      –incognito 
    # 隐身模式启动
    
      –disable-javascript 
    # 禁用Javascript
    
      --omnibox-popup-count="num" 
    # 将地址栏弹出的提示菜单数量改为num个
    
      --user-agent="xxxxxxxx" 
    # 修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果
    
      --disable-plugins 
    # 禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果
    
      --disable-javascript 
    # 禁用JavaScript,如果觉得速度慢在加上这个
    
      --disable-java 
    # 禁用java
    
      --start-maximized 
    # 启动就最大化
    
      --no-sandbox 
    # 取消沙盒模式
    
      --single-process 
    # 单进程运行
    
      --process-per-tab 
    # 每个标签使用单独进程
    
      --process-per-site 
    # 每个站点使用单独进程
    
      --in-process-plugins 
    # 插件不启用单独进程
    
      --disable-popup-blocking 
    # 禁用弹出拦截
    
      --disable-plugins 
    # 禁用插件
    
      --disable-images 
    # 禁用图像
    
      --incognito 
    # 启动进入隐身模式
    
      --enable-udd-profiles 
    # 启用账户切换菜单
    
      --proxy-pac-url 
    # 使用pac代理 [via 1/2]
    
      --lang=zh-CN 
    # 设置语言为简体中文
    
      --disk-cache-dir 
    # 自定义缓存目录
    
      --disk-cache-size 
    # 自定义缓存最大值(单位byte)
    
      --media-cache-size 
    # 自定义多媒体缓存最大值(单位byte)
    
      --bookmark-menu 
    # 在工具 栏增加一个书签按钮
    
      --enable-sync 
    # 启用书签同步
    

标签切换

1. 获取当前所有的标签页的句柄构成的列表
current_windows = driver.window_handles

2. 根据标签页句柄列表索引下标进行切换
driver.switch_to.window(current_windows[0])

3.switch_to切换frame标签

iframe进行操作,需要用到一下种方法:
 
#  先跳转到内层页面(默认使用表单的id或name属性
driver.switch_to_iframe()    # 下标方式  过时,不建议        切换到iframe上	
driver.switch_to.frame()     # iframe_name方式            切换到iframe上
driver.switch_to.default_content()         切换回原主页面

句柄

获取当前url方法:driver.current_url
获取当前页面句柄:driver.current_window_handle
获取所有页面句柄:driver.window_handles
切换窗口:driver.switch_to.window()
  • 特殊情况:有些弹窗有可能是假弹窗,需要根据真实的窗口获取xpath

  • 特殊情况:iframe里再嵌套iframe(外层iframe的name和class是动态变化的,需要绝对定位xpath)

self.driver.switch_to.frame(self.driver.find_element_by_xpath("/html/body/div[1]/div[2]/div[4]/div[2]/div[2]/iframe"))
self.driver.switch_to.frame("ptlogin_iframe")

清除浏览器窗口

	def Clear_window(self):
		# 清空其他窗口
		# 获得当前窗口
		nowhandle = self.browser.current_window_handle
		all_h = self.browser.window_handles
		for hand in all_h:
			if hand == nowhandle:
				continue
			else:
				self.browser.switch_to.window(hand)
				self.browser.close()
		self.browser.switch_to.window(nowhandle)

自动向下滑动

	def scroll_to_bottom(self,driver):
		'''自动化下滑'''
		js = "return action=document.body.scrollHeight"
		# 初始化现在滚动条所在高度为0
		height = 0
		# 当前窗口总高度
		new_height = driver.execute_script(js)
		while height < new_height:
			# 将滚动条调整至页面底部
			num_down = random.randint(10, 20)
			for i,j in zip(range(height, new_height, 100),range(num_down)):
				driver.execute_script('window.scrollTo(0, {})'.format(i))
				time.sleep(1.5)
			break

上传图片操作

  • 方法一:使用win的上传图片功能【通用操作】
   def UploadPicture(self, filePath, browser_type="Chrome"):
        """
        添加图片控制
        """
        try:
            # Chrome浏览器
            if browser_type == "Chrome":
                title = "打开"
                # Firefox浏览器
            else:
                title = "文件上传"
            dialog = win32gui.FindWindow("#32770", title)  # 一级窗口  ‘打开窗口’
            ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None)  # 二级
            ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, "ComboBox", None)  # 三级
            edit = win32gui.FindWindowEx(ComboBox, 0, "Edit", None)  # 四级
            button = win32gui.FindWindowEx(dialog, 0, "Button", None)  # 四级
            # 往文件名编辑框中输入文件路径
            win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filePath)
            # 点击打开按钮
            win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)
            time.sleep(random.uniform(3, 5))
            return True
        except Exception as error:
            print('uploadPicture error', error)
            return False
  • 方法二:使用上传按钮附近的input元素上传
self.driver.find_element_by_xpath('''//input[@data-text="true"]''').send_keys(self.image)

鼠标操作

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
 
dr = webdriver.Chrome()
dr.get('http://www.baidu.com')
ActionChains(dr).move_by_offset(200, 100).click().perform() # 鼠标左键点击, 200为x坐标, 100为y坐标
ActionChains(dr).move_by_offset(200, 100).context_click().perform() # 鼠标右键点击

键盘操作

# 导包
from selenium.webdriver.common.keys import Keys
#Keys.BAcR_sPAcE:回退键(Backspace)
#Keya.TAB:制表键(Tab)
#Keys.ENTER:回车键(Enter)
#Keya.3HIFT:大小写转换键(shift)
#Keys.CoNTROL:Control键(ctr1)
#Keya.ALT:ALT键(A1t)
#Reya.ESCAPE:返回键(Eac)
#Keya.spACE:空格键(space)
#Keya.PAGEUP:翻页键上(Page Up)
#Keya.PAGE_DoWN;翻页键下(Page Down)
#Reya.END:行尾键(End)
#Keya.HoME:行首键(Home)
#Keya.LEFT:方向键左(Left)
#Keya.UP:方向键上(Up)
#Keya.RIGHT:方向键右(Right)
#Keya.DowN:方向键下(Down)
#Keya.IN3ERT:插入键(Insert)
#DELETE:删除键(Delete)
#NUMPADO~NUMPAD9:数字键1-9
#F1~F12:F1-F12键
#(Keya.CoNTROL,'a'):组合键control+a,全选#(Keya.coNTROL,'c'):组合键control+c,复制#(Keya.CONTROL,'x'):组合键control+x,剪切
#(Keya.CoNTROL,v'):组合键control+v,粘贴

等待直到

from selenium import webdriver 

from selenium.webdriver.support.wait import WebDriverWait 

from selenium.webdriver.support import expected_conditions as EC 

from selenium.webdriver.common.by import By

 

locator=(By.XPATH,”xxxxxxx”)

d = webdriver.Chorme()

d.get(“http://www.sina.com”)

WebDriverWait(d,10,1).unitl(EC.presence_of_element_located(locator))

Print(“XXX”)

二次截图

from selenium import webdriver
import time
from PIL import Image
 
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
time.sleep(3)
 
# 演示一:全网页截图
# driver.save_screenshot('screenshot.png')
# driver.quit()
 
# 演示二:定位区块截图
driver.save_screenshot(r'photo.png')  # 一次截图:形成全图
baidu = driver.find_element_by_id('su')  # 截图按钮百度一下
# baidu = driver.find_element_by_xpath("//div[@id='lg']/img[@class='index-logo-src']") #截图百度logo图片
# print(baidu)
left = baidu.location['x']  # 区块截图左上角在网页中的x坐标
top = baidu.location['y']  # 区块截图左上角在网页中的y坐标
right = left + baidu.size['width']  # 区块截图右下角在网页中的x坐标
bottom = top + baidu.size['height']  # 区块截图右下角在网页中的y坐标
# print({"left": left, "top": top, "right": right, "bottom ": bottom})
# print("baidu.size['width']:%s" % baidu.size['width'])
# print("baidu.size['height']:%s" % baidu.size['height'])
picture = Image.open(r'photo.png')
picture = picture.crop((left, top, right, bottom))  # 二次截图:形成区块截图
picture.save(r'photo2.png')
driver.quit()

Xpath解析

  • 模糊查询

    • //ul/li[text()=“经验教程”] --全文字匹配
    • self.driver.find_element_by_link_text()
    • //a[contains(text(), “搜索”)] --模糊文字匹配
    • //li[contains,(.,‘单次预约’)]
  • 常用解析

    • 解析文字:post_time = selector.xpath(’//div[@class=“video-data”]/span/text()’)

    • 解析结果:[‘295播放\xa0·\xa0’, ‘0弹幕’, ‘2020-12-05 09:00:01’]

    • 普通解析

      extract() 返回一个包含有字符串的列表,配合[0]使用

      extract_first() 返回列表中的第一个字符串,列表为空没有返回None

      get() 提取列表中第1个文本内容(等同于extract_first())

Xpath难点

  • 元素无法点击(报错:该元素不是可点击元素)【客户端渲染,需要研究分析js代码实现同等效果的操作;或者通过火狐浏览器对js代码点击事件进行研究】
    • 例子:头条号微头条上传图片的点击按钮
  • Message: element not interactable【1、等待元素完全加载。2、换xpath方式进行解析实现(chrome复制的xpath)】
    • 例子:头条号写回答无法定位元素进行send_key
  • 跳转的链接是通过客户端异步加载完成的,当你鼠标放在跳转元素上,无法看到跳转的链接【无法复制链接地址、无法生成新的链接标签页面】,唯有你点击之后才会跳转覆盖当前页面
  • 元素无法交互【下拉框】
    • 先点击下拉图标让数据显示出来再通过xpath直接定位

Chrome 识别标志

consloe:navigator

Selenium 键盘操作

键值解释
send_keys(Keys.BACK_SPACE)删除键BackSpace
send_keys(Keys.SPACE)空格键Space
send_keys(Keys.TAB)制表键Tab
send_keys(Keys.ESPACE)回退键Esc
send_keys(Keys.ENTER)回车键Enter
send_keys(Keys.CONTROL,‘a’)全选Ctrl+A
send_keys(Keys.CONTROL,‘c’)复制CTRL+C
send_keys(Keys.CONTROL,‘x’)剪切CTRL+X
send_keys(Keys.CONTROL,‘v’)粘贴Ctrl+V
send_keys(Keys.F1)键盘F1
send_keys(Keys.F12)键盘F12

Selenium 注意问题

  • 切换页面得时候一定要多等几面,等加载完
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium 常用API大全(一篇就够) 的相关文章

  • 使用 PRAW 帮助获取 Reddit 帖子链接到的 URL

    我正在尝试使用 Praw 获取 Reddit 提交标题中链接的帖子 例如提交 http www reddit com r AdviceAnimals comments 1adu71 apparently people still need
  • PHP 版本如何匹配“API=yyyymmdd”签名/标签?

    是否有明确且可靠的来源来找出哪个 PHP 发行版本 x y z 携带 使用哪个 API yyyymmdd 签名 标签 PHP 的版本控制存储库是 PHP 版本与其 API 日期版本之间相关性的权威来源 请记住 仅主要版本PHP 的版本 例如
  • 截取屏幕截图时出现异常 null 且配置失败:@AfterMethod 拆解

    从昨天开始我遇到了一些麻烦并且陷入困境 无法找出其原因 在这里尝试了答案的解决方案 我创建了 Test 其中包含用于登录和检查应用程序仪表板的代码示例 和 AfterMethod 当 Assert 为 false 时 应该捕获屏幕截图 如果
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 415 不支持的媒体类型; Angular2 到 API

    我是 Angular 2 的新手 我面临着一个无法找到解决方案的问题 当我尝试从 Angular 2 发布到 API 时 我得到 415 不支持的媒体类型 角度2代码 onSubmit value any console log value
  • Selenium 单击在 Internet Explorer 11 上不起作用

    我尝试在 Internet Explorer 上单击 selenium 但它不起作用 我努力了element click moveToElement element click build perform javascript没事了 事实上
  • Selenium WebDriver - 意外的模式对话框警报

    我正在尝试使用 WebDriver 来自动化网站 我正在使用 Firefox 驱动程序 但主页有一个弹出模式警报窗口 显示 您需要使用 IE 6 0 才能查看此应用程序 还有一些 功能可能无法使用 我检查了页面的来源 它有一个功能 Moda
  • Selenium 不会在新选项卡中打开新 URL(Python 和 Chrome)

    我想使用 Selenium WebDriver 和 Python 在不同的选项卡中打开相当多的 URL 我不确定出了什么问题 driver webdriver Chrome driver get url1 time sleep 5 driv
  • selenium-webdriver 与 webdriverjs 有什么区别(以及何时使用)?

    我是一位使用 selenium webdriver 的经验丰富的专业人士 我正在探索有关如何测试 javascript 应用程序的更多选项 我发现了 webdriverJs 不幸的是 我不明白这两者 2 之间有什么区别 有人可以解释一下何时
  • Spotify Apps API:库类不会返回用户播放列表

    我试图获取一个包含用户库中所有播放列表的数组 http developer spotify com download spotify apps api reference dcdebc652c html 其他类属性 专辑 艺术家 加星标的播
  • Twitter 的推文按钮有回调吗?

    有没有办法在 Twitter 的推文按钮上注册回调 我希望能够跟踪我网站上的哪些特定用户在 Twitter 上发布了链接 我无法添加 onClick 事件 因为它是跨域 iFrame 还有其他想法吗 我见过一种方法 https stacko
  • Selenium IDE-自动化Select2搜索框

    我正在尝试自动化 selenium IDE 中的 select2 搜索框 我打开它并输入了我正在搜索的搜索关键字 但是 即使我有用于显示结果的代码 它也不起作用 问题是我猜字符输入得太快 因此结果不会显示在搜索框中 我确信我在某个地方出错了
  • 使用 selenium 和 python 来提取 javascript 生成的 HTML?萤火虫?

    这里是Python新手 我遇到的是数据收集问题 我在这个网站上 当我用 Firebug 检查我想要的元素时 它显示了包含我需要的信息的源 然而常规源代码 没有 Firebug 不会给我这个信息 这意味着我也无法通过正常的 selenium
  • 加速美丽汤

    我正在运行本课程网站的抓取工具 我想知道将页面放入 beautifulsoup 后是否有更快的方法来抓取页面 花费的时间比我预期的要长得多 Tips from selenium import webdriver from selenium
  • 硒脚本

    我想使用 selenium 脚本逐个单击网页上的一堆链接 每次单击都会刷新页面 然而 selenium 不支持像 visited 这样的 css 伪类 所以我无法区分已经点击的和我接下来要点击的 有办法解决我的问题吗 这是我的代码 http
  • Selenium 中的“断言”与“验证”

    Selenium 执行的检查通常有两种形式 assertFoo 和 verifyFoo 据我所知 assertFoo 使整个测试用例失败 而 verifyFoo 只是记录该检查的失败并让测试用例继续进行 因此 使用 verifyFoo 即使
  • 如何设置 Firefox 配置文件:Selenium RC、.Net 客户端驱动程序?

    我正在使用 Selenium RC Net 客户端驱动程序 我在 c selenium 目录中创建了一个 Firefox 配置文件 这是我的代码 Dim MySelenium As ISelenium Nothing MySelenium
  • 为 NFL api 生成访问令牌

    NFL 有一个 API 服务 link https api nfl com docs getting started index html https api nfl com docs getting started index html
  • Selenium 是否可以单独用于自动化 Intranet Web 门户的测试,其中门户上的链接定向到 SAP 应用程序

    是否可以单独使用 Selenium 来自动测试 Intranet Web 门户 其中门户上的链接定向到 SAP 应用程序 Portal 仅适用于 IE 和 Windows 操作系统上的 SAP 应用程序 用最简单的话来说 Selenium
  • 使用selenium IDE提取部分文本并将其放入变量中

    有人可以告诉我应该使用哪个命令来使用 Selenium Ide 从文本中仅提取数字 694575 并将其放入变量中以供进一步使用 这是带有文本的 div div class loginBoxTitle Edit Exhibition Cen

随机推荐

  • Git 中 6 个基本常用命令

    大家好啊 xff0c 我是大田 想更深刻了解 Git 常用命令 xff0c 先来看看原理图 xff1a 我们使用 Git 操作的核心步骤就是 xff1a 先add代码到git缓存 然后commit到git本地仓库 最后push到远程Gith
  • Ubutun 使用easy-rsa 自签证书

    sudo apt install easy rsa mkdir root cert easy rsa ln s usr share easy rsa easy rsa cd root cert easy rsa easyrsa init p
  • Ubuntu ARM环境安装

    基础环境 防火墙 jiangzz 64 ubuntu span class token function sudo span ufw status Status inactive jiangzz 64 ubuntu span class t
  • 关系代数练习

    设有三个关系 xff1a S S SNAME AGE SEX SC S C GRADE C C xff0c CNAME xff0c TEACHER 试用关系代数表达式表示下列查询语句 xff1a 1 检索LIU老师所授课程的课程号和课程名
  • 使用Opencv调用摄像头失败的解决办法

    这几天参考 OpenCV3编程入门 书中的 调用摄像头采集图像的代码进行编程 xff0c 可是代码照着书上的打完了 xff0c 进行编译的时候竟然报错了 xff0c 于是乎就在网上查找错误的解决办法 xff0c 一开始是以为自己的驱动没装好
  • java日记(一)理解代码片段

    最近跟着Berkeley的CS61B学java 跨专业小白一个学起来比较吃力 xff0c 还好有大佬带着 决定开个贴子整理一下 代码片段是 xff1a DO NOT MODIFY ANYTHING ABOVE THIS LINE span
  • IOS - ReplayKit2 获取影像方向+ReplayKit的坑

    插件对象 64 interface SampleHandler RPBroadcastSampleHandler 重写方法 void processSampleBuffer CMSampleBufferRef sampleBuffer wi
  • Sublime Text运行C和C++程序

    原文链接 xff1a Sublime Text运行C和C 43 43 程序 Sublime Text 是一款当下非常流行的文本编辑器 xff0c 其功能强大 xff08 提供有众多的插件 xff09 界面简洁 还支持跨平台使用 xff08
  • VTK——自定义三维裁剪Widget,恢复Widget(任意形状,圆形,矩形裁剪)vtkCustomPaintWidget

    裁剪图标可以通过键盘上下键切换 xff0c 裁剪模式可以通过键盘左右键切换 xff0c 裁剪区域的显示 xff0c 可以显示为Mask或者显示为Contour边界 xff0c 测试效果如下
  • iOS UITableViewCell高度自适应

    UITableViewCell高度自适应 iOS8之后 我们只需要设置这两句代码之后 xff0c 即可放心的往cell的控件里面加上内容 xff0c cell会根据内部所有控件的高度动态的计算自己的高度从而显示出来 tableView es
  • 记一次vncServer的离线安装经历

    记一次vncServer的离线安装经历 背景 xff1a 需要在一台服务器上面装Oracle xff0c 但是服务器并不能接触到 xff0c 所以只能在客户端进行远程ssh操作 首先根据我以往装Oracle的经验 xff0c 先把安装包这些
  • debian 修改桌面背景

    64 桌面背景 push 图片到对应目录替换 xff1a adb push 图片 usr share desktop base active theme wallpaper contents images 64 当前语言查看 cat etc
  • 【计算机图形学基础教程】MFC基本绘图函数2

    MFC基本绘图函数 绘图工具类 CGdiObject类 xff1a GDI绘图工具的基类CBitmap类 xff1a 封装了GDI画刷 xff0c 可以选作设备上下文的当前画刷 xff0c 用于填充图形的内部CFont类 xff1a 封装了
  • thrift安装及示例

    1 简介 Apache Thrift软件框架 xff08 用于可扩展的跨语言服务开发 xff09 将软件堆栈与代码生成引擎结合在一起 xff0c 它有自己的跨机器的通信框架 xff0c 并提供一套库 它是一个代码生成器 xff0c 按照它的
  • you-get库二开,带UI界面的下载器

    you get库二开 带UI界面的下载器 span class token comment coding utf 8 span span class token comment Form implementation generated f
  • 工厂方法模式【Python篇】

    前言 在 设计模式 一书中工厂模式提到了 xff1a 工厂方法模式 xff08 Factory Method xff09 抽象工厂模式 xff08 Abstract Factory xff09 但是在实际过程中还有一种工厂模式经常被使用 x
  • docker安装gitlab 教程详解

    文章目录 前言一 环境处理二 docker部署gitlab三 调整gitlab配置1 配置克隆项目时所需2 root所需 参考 前言 环境 xff1a 1 xff1a Linux dnsserver moa kdzl cn 3 10 0 6
  • 问题解决:consider to specify kernel configuration cache directory through OPENCV_OCL4DNN_CONFIG_PATH par

    在使用Openpose代码运行的时候 xff0c 提示 xff1a consider to specify kernel configuration cache directory through OPENCV OCL4DNN CONFIG
  • zabbix监控平台搭建,及监控华为S5735S系列交换机和2288hv5服务器

    提要 无监控不运维 xff01 告别 救火员 的运维 二次搭建zabbix了 xff0c 这次打算以zabbix 集团基础硬件为主 43 prometheus k8s 43 微服务集群为主 43 grafana dashbroad展示 xf
  • Selenium 常用API大全(一篇就够)

    Selenium Crawl API xff08 一篇就够 xff09 万字长文整理不易 xff0c 希望对各位有所帮助 xff0c 欢迎大家一键三连 xff0c 点赞收藏加关注 同时也欢迎大家交流分享 xff0c 共同学习互相进步 xff