<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>ERP开发者</title><link>http://27.45.230.218/</link><description>科技带来生产力</description><item><title>Linux ubuntu安装VNC Viewer</title><link>http://27.45.230.218/?id=18</link><description>&lt;p&gt;首先去VNC Viewer官网下载Linux版的VNC Viewer&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;官网：https://www.realvnc.com/en/connect/download/viewer/&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;然后在终端进入安装包存放的地址，然后切换到root用户，再用指令sudo dpkg -i 安装包名称（其中-i等价于--install）即可安装成功&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;然后搜索应用即可打开了&lt;/p&gt;</description><pubDate>Wed, 27 Apr 2022 22:18:33 +0800</pubDate></item><item><title>Ubuntu 20.04 软件中心换成了 snap</title><link>http://27.45.230.218/?id=17</link><description>&lt;p&gt;&lt;span data-shimo-docs=&quot;[[20,&amp;quot;Ubuntu 20.04 默认把软件中心换成了 snap, 感觉 snap 应用老出状况, snap 应用不但体积大, 安装好的应用还不时就崩溃, 所以如果要把电脑里的所有 snap 应用全部替换了, snapd 也卸载了.&amp;nbsp;&amp;nbsp;&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;orDK\&amp;quot;&amp;quot;],[20,&amp;quot;Terminal终端执行具体如下:&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;WQCz\&amp;quot;&amp;quot;],[20,&amp;quot;sudo apt install ubuntu-software&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;wCWK\&amp;quot;&amp;quot;],[20,&amp;quot;sudo snap remove snap-store&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;my0v\&amp;quot;&amp;quot;],[20,&amp;quot;sudo apt purge snapd&amp;quot;]]&quot;&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;orDK&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;Ubuntu 20.04 默认把软件中心换成了 snap, 感觉 snap 应用老出状况, snap 应用不但体积大, 安装好的应用还不时就崩溃, 所以如果要把电脑里的所有 snap 应用全部替换了, snapd 也卸载了.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;WQCz&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;Terminal终端执行具体如下:&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;wCWK&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;sudo apt install ubuntu-software&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;my0v&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;sudo snap remove snap-store&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;lVAX&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;sudo apt purge snapd&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 27 Apr 2022 22:17:45 +0800</pubDate></item><item><title>Python Selenium库的使用自动化浏览器操作测试</title><link>http://27.45.230.218/?id=16</link><description>&lt;p&gt;（一）Selenium基础&lt;/p&gt;&lt;p&gt;入门教程：Selenium官网教程&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1.Selenium简介&lt;/p&gt;&lt;p&gt;Selenium是一个用于测试网站的自动化测试工具，支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器，同时也支持phantomJS无界面浏览器。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;2.支持多种操作系统&lt;/p&gt;&lt;p&gt;如Windows、Linux、IOS、Android等。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;3.安装Selenium&lt;/p&gt;&lt;p&gt;pip install Selenium&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;4.安装浏览器驱动&lt;/p&gt;&lt;p&gt;Selenium3.x调用浏览器必须有一个webdriver驱动文件&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Chrome驱动文件下载：点击下载chromedrive&lt;/p&gt;&lt;p&gt;Firefox驱动文件下载:点解下载geckodriver&lt;/p&gt;&lt;p&gt;5.配置环境变量&lt;/p&gt;&lt;p&gt;设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录，如： F:\GeckoDriver , 将下载的浏览器驱动文件（例如：chromedriver、geckodriver）丢到该目录下。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;我的电脑–&amp;gt;属性–&amp;gt;系统设置–&amp;gt;高级–&amp;gt;环境变量–&amp;gt;系统变量–&amp;gt;Path，将“F:\GeckoDriver”目录添加到Path的值中。比如：Path字段;F:\GeckoDriver&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;参考浏览器驱动环境配置&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;(二)Selenium 快速入门&lt;/p&gt;&lt;p&gt;入门参考文献：Selenium入门&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1.Selenium提供了8种定位方式:&lt;/p&gt;&lt;p&gt;id&lt;/p&gt;&lt;p&gt;name&lt;/p&gt;&lt;p&gt;class name&lt;/p&gt;&lt;p&gt;tag name&lt;/p&gt;&lt;p&gt;link text&lt;/p&gt;&lt;p&gt;partial link text&lt;/p&gt;&lt;p&gt;xpath&lt;/p&gt;&lt;p&gt;css selector&lt;/p&gt;&lt;p&gt;2.定位元素的8种方式&lt;/p&gt;&lt;p&gt;参考：selenium元素定位&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;定位一个元素 定位多个元素 含义&lt;/p&gt;&lt;p&gt;find_element_by_id find_elements_by_id 通过元素id定位&lt;/p&gt;&lt;p&gt;find_element_by_name find_elements_by_name 通过元素name定位&lt;/p&gt;&lt;p&gt;find_element_by_xpath find_elements_by_xpath 通过xpath表达式定位&lt;/p&gt;&lt;p&gt;find_element_by_link_text find_elements_by_link_tex 通过完整超链接定位&lt;/p&gt;&lt;p&gt;find_element_by_partial_link_text find_elements_by_partial_link_text 通过部分链接定位&lt;/p&gt;&lt;p&gt;find_element_by_tag_name find_elements_by_tag_name 通过标签定位&lt;/p&gt;&lt;p&gt;find_element_by_class_name find_elements_by_class_name 通过类名进行定位&lt;/p&gt;&lt;p&gt;find_elements_by_css_selector find_elements_by_css_selector 通过css选择器进行定位&lt;/p&gt;&lt;p&gt;3.实例演示&lt;/p&gt;&lt;p&gt;假如我们有一个Web页面，通过前端工具（如，Firebug）查看到一个元素的属性是这样的。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;html&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;head&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;body link=&amp;quot;#0000cc&amp;quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;a id=&amp;quot;result_logo&amp;quot; href=&amp;quot;/&amp;quot; onmousedown=&amp;quot;return c({&amp;#39;fm&amp;#39;:&amp;#39;tab&amp;#39;,&amp;#39;tab&amp;#39;:&amp;#39;logo&amp;#39;})&amp;quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;form id=&amp;quot;form&amp;quot; name=&amp;quot;f&amp;quot; action=&amp;quot;/s&amp;quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;input id=&amp;quot;kw&amp;quot; name=&amp;quot;wd&amp;quot; value=&amp;quot;&amp;quot; maxlength=&amp;quot;255&amp;quot; autocomplete=&amp;quot;off&amp;quot;&amp;gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;通过id定位:&lt;/p&gt;&lt;p&gt;dr.find_element_by_id(&amp;quot;kw&amp;quot;)&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;通过name定位:&lt;/p&gt;&lt;p&gt;dr.find_element_by_name(&amp;quot;wd&amp;quot;)&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;通过class name定位:&lt;/p&gt;&lt;p&gt;dr.find_element_by_class_name(&amp;quot;s_ipt&amp;quot;)&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;通过tag name定位:&lt;/p&gt;&lt;p&gt;dr.find_element_by_tag_name(&amp;quot;input&amp;quot;)&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;通过xpath定位，xpath定位有N种写法，这里列几个常用写法:&lt;/p&gt;&lt;p&gt;dr.find_element_by_xpath(&amp;quot;//*[@id=&amp;#39;kw&amp;#39;]&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_xpath(&amp;quot;//*[@name=&amp;#39;wd&amp;#39;]&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_xpath(&amp;quot;//input[@class=&amp;#39;s_ipt&amp;#39;]&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_xpath(&amp;quot;/html/body/form/span/input&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_xpath(&amp;quot;//span[@class=&amp;#39;soutu-btn&amp;#39;]/input&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_xpath(&amp;quot;//form[@id=&amp;#39;form&amp;#39;]/span/input&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_xpath(&amp;quot;//input[@id=&amp;#39;kw&amp;#39; and @name=&amp;#39;wd&amp;#39;]&amp;quot;)&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;通过css定位，css定位有N种写法，这里列几个常用写法:&lt;/p&gt;&lt;p&gt;dr.find_element_by_css_selector(&amp;quot;#kw&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_css_selector(&amp;quot;[name=wd]&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_css_selector(&amp;quot;.s_ipt&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_css_selector(&amp;quot;html &amp;gt; body &amp;gt; form &amp;gt; span &amp;gt; input&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_css_selector(&amp;quot;span.soutu-btn&amp;gt; input#kw&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_css_selector(&amp;quot;form#form &amp;gt; span &amp;gt; input&amp;quot;)&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;接下来，我们的页面上有一组文本链接。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a href=&amp;quot;http://news.baidu.com&amp;quot; name=&amp;quot;tj_trnews&amp;quot;&amp;gt;新闻&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;a href=&amp;quot;http://www.hao123.com&amp;quot; name=&amp;quot;tj_trhao123&amp;quot;&amp;gt;hao123&amp;lt;/a&amp;gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;通过link text定位:&lt;/p&gt;&lt;p&gt;dr.find_element_by_link_text(&amp;quot;新闻&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_link_text(&amp;quot;hao123&amp;quot;)&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;通过partial link text定位:&lt;/p&gt;&lt;p&gt;dr.find_element_by_partial_link_text(&amp;quot;新&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_partial_link_text(&amp;quot;hao&amp;quot;)&lt;/p&gt;&lt;p&gt;dr.find_element_by_partial_link_text(&amp;quot;123&amp;quot;)&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4.Selenium库下webdriver模块常用方法的使用&lt;/p&gt;&lt;p&gt;1.控制浏览器操作的一些方法&lt;/p&gt;&lt;p&gt;方法 说明&lt;/p&gt;&lt;p&gt;set_window_size() 设置浏览器的大小&lt;/p&gt;&lt;p&gt;back() 控制浏览器后退&lt;/p&gt;&lt;p&gt;forward() 控制浏览器前进&lt;/p&gt;&lt;p&gt;refresh() 刷新当前页面&lt;/p&gt;&lt;p&gt;clear() 清除文本&lt;/p&gt;&lt;p&gt;send_keys (value) 模拟按键输入&lt;/p&gt;&lt;p&gt;click() 单击元素&lt;/p&gt;&lt;p&gt;submit() 用于提交表单&lt;/p&gt;&lt;p&gt;get_attribute(name) 获取元素属性值&lt;/p&gt;&lt;p&gt;is_displayed() 设置该元素是否用户可见&lt;/p&gt;&lt;p&gt;size 返回元素的尺寸&lt;/p&gt;&lt;p&gt;text 获取元素的文本&lt;/p&gt;&lt;p&gt;实例演示&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from time import sleep&lt;/p&gt;&lt;p&gt;#1.创建Chrome浏览器对象，这会在电脑上在打开一个浏览器窗口&lt;/p&gt;&lt;p&gt;browser = webdriver.Firefox(executable_path =&amp;quot;F:\GeckoDriver\geckodriver&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#2.通过浏览器向服务器发送URL请求&lt;/p&gt;&lt;p&gt;browser.get(&amp;quot;https://www.baidu.com/&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;sleep(3)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#3.刷新浏览器&lt;/p&gt;&lt;p&gt;browser.refresh()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#4.设置浏览器的大小&lt;/p&gt;&lt;p&gt;browser.set_window_size(1400,800)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#5.设置链接内容&lt;/p&gt;&lt;p&gt;element=browser.find_element_by_link_text(&amp;quot;新闻&amp;quot;)&lt;/p&gt;&lt;p&gt;element.click()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;element=browser.find_element_by_link_text(&amp;quot;“下团组”时间&amp;quot;)&lt;/p&gt;&lt;p&gt;element.click()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12&lt;/p&gt;&lt;p&gt;13&lt;/p&gt;&lt;p&gt;14&lt;/p&gt;&lt;p&gt;15&lt;/p&gt;&lt;p&gt;16&lt;/p&gt;&lt;p&gt;17&lt;/p&gt;&lt;p&gt;18&lt;/p&gt;&lt;p&gt;19&lt;/p&gt;&lt;p&gt;20&lt;/p&gt;&lt;p&gt;21&lt;/p&gt;&lt;p&gt;22&lt;/p&gt;&lt;p&gt;23&lt;/p&gt;&lt;p&gt;2.鼠标事件&lt;/p&gt;&lt;p&gt;在 WebDriver 中， 将这些关于鼠标操作的方法封装在 ActionChains 类提供。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方法 说明&lt;/p&gt;&lt;p&gt;ActionChains(driver) 构造ActionChains对象&lt;/p&gt;&lt;p&gt;context_click() 执行鼠标悬停操作&lt;/p&gt;&lt;p&gt;move_to_element(above) 右击&lt;/p&gt;&lt;p&gt;double_click() 双击&lt;/p&gt;&lt;p&gt;drag_and_drop() 拖动&lt;/p&gt;&lt;p&gt;move_to_element(above) 执行鼠标悬停操作&lt;/p&gt;&lt;p&gt;context_click() 用于模拟鼠标右键操作， 在调用时需要指定元素定位&lt;/p&gt;&lt;p&gt;perform() 执行所有 ActionChains 中存储的行为，可以理解成是对整个操作的提交动作&lt;/p&gt;&lt;p&gt;实例演示&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;#1.引入 ActionChains 类&lt;/p&gt;&lt;p&gt;from selenium.webdriver.common.action_chains import ActionChains&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#1.创建Chrome浏览器对象，这会在电脑上在打开一个浏览器窗口&lt;/p&gt;&lt;p&gt;driver = webdriver.Firefox(executable_path =&amp;quot;F:\GeckoDriver\geckodriver&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.get(&amp;quot;https://www.baidu.com&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#2.定位到要悬停的元素&lt;/p&gt;&lt;p&gt;element= driver.find_element_by_link_text(&amp;quot;设置&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#3.对定位到的元素执行鼠标悬停操作&lt;/p&gt;&lt;p&gt;ActionChains(driver).move_to_element(element).perform()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#找到链接&lt;/p&gt;&lt;p&gt;elem1=driver.find_element_by_link_text(&amp;quot;搜索设置&amp;quot;)&lt;/p&gt;&lt;p&gt;elem1.click()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#通过元素选择器找到id=sh_2,并点击设置&lt;/p&gt;&lt;p&gt;elem2=driver.find_element_by_id(&amp;quot;sh_1&amp;quot;)&lt;/p&gt;&lt;p&gt;elem2.click()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#保存设置&lt;/p&gt;&lt;p&gt;elem3=driver.find_element_by_class_name(&amp;quot;prefpanelgo&amp;quot;)&lt;/p&gt;&lt;p&gt;elem3.click()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12&lt;/p&gt;&lt;p&gt;13&lt;/p&gt;&lt;p&gt;14&lt;/p&gt;&lt;p&gt;15&lt;/p&gt;&lt;p&gt;16&lt;/p&gt;&lt;p&gt;17&lt;/p&gt;&lt;p&gt;18&lt;/p&gt;&lt;p&gt;19&lt;/p&gt;&lt;p&gt;20&lt;/p&gt;&lt;p&gt;21&lt;/p&gt;&lt;p&gt;22&lt;/p&gt;&lt;p&gt;23&lt;/p&gt;&lt;p&gt;24&lt;/p&gt;&lt;p&gt;25&lt;/p&gt;&lt;p&gt;26&lt;/p&gt;&lt;p&gt;27&lt;/p&gt;&lt;p&gt;28&lt;/p&gt;&lt;p&gt;29&lt;/p&gt;&lt;p&gt;3.键盘事件&lt;/p&gt;&lt;p&gt;Selenium中的Key模块为我们提供了模拟键盘按键的方法，那就是send_keys()方法。它不仅可以模拟键盘输入，也可以模拟键盘的操作。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;常用的键盘操作如下：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;模拟键盘按键 说明&lt;/p&gt;&lt;p&gt;send_keys(Keys.BACK_SPACE) 删除键（BackSpace）&lt;/p&gt;&lt;p&gt;send_keys(Keys.SPACE) 空格键(Space)&lt;/p&gt;&lt;p&gt;send_keys(Keys.TAB) 制表键(Tab)&lt;/p&gt;&lt;p&gt;send_keys(Keys.ESCAPE) 回退键（Esc）&lt;/p&gt;&lt;p&gt;send_keys(Keys.ENTER) 回车键（Enter）&lt;/p&gt;&lt;p&gt;组合键的使用&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;模拟键盘按键 说明&lt;/p&gt;&lt;p&gt;send_keys(Keys.CONTROL,‘a’) 全选（Ctrl+A）&lt;/p&gt;&lt;p&gt;send_keys(Keys.CONTROL,‘c’) 复制（Ctrl+C）&lt;/p&gt;&lt;p&gt;send_keys(Keys.CONTROL,‘x’) 剪切（Ctrl+X）&lt;/p&gt;&lt;p&gt;send_keys(Keys.CONTROL,‘v’) 粘贴（Ctrl+V）&lt;/p&gt;&lt;p&gt;send_keys(Keys.F1…Fn) 键盘 F1…Fn&lt;/p&gt;&lt;p&gt;4.获取断言信息&lt;/p&gt;&lt;p&gt;不管是在做功能测试还是自动化测试，最后一步需要拿实际结果与预期进行比较。这个比较的称之为断言。通过我们获取title 、URL和text等信息进行断言。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;属性 说明&lt;/p&gt;&lt;p&gt;title 用于获得当前页面的标题&lt;/p&gt;&lt;p&gt;current_url 用户获得当前页面的URL&lt;/p&gt;&lt;p&gt;text 获取搜索条目的文本信息&lt;/p&gt;&lt;p&gt;实例演示&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;from time import sleep&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver = webdriver.Firefox(executable_path =&amp;quot;F:\GeckoDriver\geckodriver&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.get(&amp;quot;https://www.baidu.com&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;print(&amp;#39;Before search================&amp;#39;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 打印当前页面title&lt;/p&gt;&lt;p&gt;title = driver.title&lt;/p&gt;&lt;p&gt;print(title)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 打印当前页面URL&lt;/p&gt;&lt;p&gt;now_url = driver.current_url&lt;/p&gt;&lt;p&gt;print(now_url)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.find_element_by_id(&amp;quot;kw&amp;quot;).send_keys(&amp;quot;selenium&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.find_element_by_id(&amp;quot;su&amp;quot;).click()&lt;/p&gt;&lt;p&gt;sleep(1)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;print(&amp;#39;After search================&amp;#39;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 再次打印当前页面title&lt;/p&gt;&lt;p&gt;title = driver.title&lt;/p&gt;&lt;p&gt;print(title)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 打印当前页面URL&lt;/p&gt;&lt;p&gt;now_url = driver.current_url&lt;/p&gt;&lt;p&gt;print(now_url)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 获取结果数目&lt;/p&gt;&lt;p&gt;user = driver.find_element_by_class_name(&amp;#39;nums&amp;#39;).text&lt;/p&gt;&lt;p&gt;print(user)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#关闭所有窗口&lt;/p&gt;&lt;p&gt;driver.quit()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12&lt;/p&gt;&lt;p&gt;13&lt;/p&gt;&lt;p&gt;14&lt;/p&gt;&lt;p&gt;15&lt;/p&gt;&lt;p&gt;16&lt;/p&gt;&lt;p&gt;17&lt;/p&gt;&lt;p&gt;18&lt;/p&gt;&lt;p&gt;19&lt;/p&gt;&lt;p&gt;20&lt;/p&gt;&lt;p&gt;21&lt;/p&gt;&lt;p&gt;22&lt;/p&gt;&lt;p&gt;23&lt;/p&gt;&lt;p&gt;24&lt;/p&gt;&lt;p&gt;25&lt;/p&gt;&lt;p&gt;26&lt;/p&gt;&lt;p&gt;27&lt;/p&gt;&lt;p&gt;28&lt;/p&gt;&lt;p&gt;29&lt;/p&gt;&lt;p&gt;30&lt;/p&gt;&lt;p&gt;31&lt;/p&gt;&lt;p&gt;32&lt;/p&gt;&lt;p&gt;33&lt;/p&gt;&lt;p&gt;34&lt;/p&gt;&lt;p&gt;35&lt;/p&gt;&lt;p&gt;36&lt;/p&gt;&lt;p&gt;37&lt;/p&gt;&lt;p&gt;打印输出结果&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Before search================&lt;/p&gt;&lt;p&gt;百度一下，你就知道&lt;/p&gt;&lt;p&gt;https://www.baidu.com/&lt;/p&gt;&lt;p&gt;After search================&lt;/p&gt;&lt;p&gt;selenium_百度搜索&lt;/p&gt;&lt;p&gt;https://www.baidu.com/s?ie=utf-8&amp;amp;f=8&amp;amp;rsv_bp=0&amp;amp;rsv_idx=1&amp;amp;tn=baidu&amp;amp;wd=selenium&amp;amp;rsv_pq=a1d51b980000e36e&amp;amp;rsv_t=a715IZaMpLd1w92I4LNUi7gKuOdlAz5McsHe%2FSLQeBZD44OUIPnjY%2B7pODM&amp;amp;rqlang=cn&amp;amp;rsv_enter=0&amp;amp;rsv_sug3=8&amp;amp;inputT=758&amp;amp;rsv_sug4=759&lt;/p&gt;&lt;p&gt;搜索工具&lt;/p&gt;&lt;p&gt;百度为您找到相关结果约7,170,000个&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;5.设置元素等待:参考文献&lt;/p&gt;&lt;p&gt;6.定位一组元素&lt;/p&gt;&lt;p&gt;定位一组元素的方法与定位单个元素的方法类似，唯一的区别是在单词element后面多了一个s表示复数。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;实例演示&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;from time import sleep&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver =webdriver.Firefox(executable_path =&amp;quot;F:\GeckoDriver\geckodriver&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.get(&amp;quot;https://www.baidu.com&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.find_element_by_id(&amp;quot;kw&amp;quot;).send_keys(&amp;quot;selenium&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.find_element_by_id(&amp;quot;su&amp;quot;).click()&lt;/p&gt;&lt;p&gt;sleep(1)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#1.定位一组元素&lt;/p&gt;&lt;p&gt;elements = driver.find_elements_by_xpath(&amp;#39;//div/h3/a&amp;#39;)&lt;/p&gt;&lt;p&gt;print(type(elements))&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#2.循环遍历出每一条搜索结果的标题&lt;/p&gt;&lt;p&gt;for t in elements:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; print(t.text)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; element=driver.find_element_by_link_text(t.text)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; element.click()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; sleep(3)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.quit()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12&lt;/p&gt;&lt;p&gt;13&lt;/p&gt;&lt;p&gt;14&lt;/p&gt;&lt;p&gt;15&lt;/p&gt;&lt;p&gt;16&lt;/p&gt;&lt;p&gt;17&lt;/p&gt;&lt;p&gt;18&lt;/p&gt;&lt;p&gt;19&lt;/p&gt;&lt;p&gt;20&lt;/p&gt;&lt;p&gt;21&lt;/p&gt;&lt;p&gt;22&lt;/p&gt;&lt;p&gt;7.多表单切换&lt;/p&gt;&lt;p&gt;在Web应用中经常会遇到frame/iframe表单嵌套页面的应用，WebDriver只能在一个页面上对元素识别与定位，对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方法 说明&lt;/p&gt;&lt;p&gt;switch_to.frame() 将当前定位的主体切换为frame/iframe表单的内嵌页面中&lt;/p&gt;&lt;p&gt;switch_to.default_content() 跳回最外层的页面&lt;/p&gt;&lt;p&gt;&amp;lt;html&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; ...&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;iframe id=&amp;quot;x-URS-iframe&amp;quot; ...&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;html&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;body&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;...&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;input name=&amp;quot;email&amp;quot; &amp;gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;126邮箱登录框的结构大概是这样子的，想要操作登录框必须要先切换到iframe表单。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver = webdriver.Chrome()&lt;/p&gt;&lt;p&gt;driver.get(&amp;quot;http://www.126.com&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.switch_to.frame(&amp;#39;x-URS-iframe&amp;#39;)&lt;/p&gt;&lt;p&gt;driver.find_element_by_name(&amp;quot;email&amp;quot;).clear()&lt;/p&gt;&lt;p&gt;driver.find_element_by_name(&amp;quot;email&amp;quot;).send_keys(&amp;quot;username&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.find_element_by_name(&amp;quot;password&amp;quot;).clear()&lt;/p&gt;&lt;p&gt;driver.find_element_by_name(&amp;quot;password&amp;quot;).send_keys(&amp;quot;password&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.find_element_by_id(&amp;quot;dologin&amp;quot;).click()&lt;/p&gt;&lt;p&gt;driver.switch_to.default_content()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.quit()&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12&lt;/p&gt;&lt;p&gt;13&lt;/p&gt;&lt;p&gt;14&lt;/p&gt;&lt;p&gt;switch_to.frame() 默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性，则可以通过下面的方式进行定位。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;……&lt;/p&gt;&lt;p&gt;#先通过xpth定位到iframe&lt;/p&gt;&lt;p&gt;xf = driver.find_element_by_xpath(&amp;#39;//*[@id=&amp;quot;x-URS-iframe&amp;quot;]&amp;#39;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#再将定位对象传给switch_to.frame()方法&lt;/p&gt;&lt;p&gt;driver.switch_to.frame(xf)&lt;/p&gt;&lt;p&gt;……&lt;/p&gt;&lt;p&gt;driver.switch_to.parent_frame()&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;8.多窗口切换&lt;/p&gt;&lt;p&gt;在页面操作过程中有时候点击某个链接会弹出新的窗口，这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法，可以实现在不同的窗口之间切换。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方法 说明&lt;/p&gt;&lt;p&gt;current_window_handle 获得当前窗口句柄&lt;/p&gt;&lt;p&gt;window_handles 返回所有窗口的句柄到当前会话&lt;/p&gt;&lt;p&gt;switch_to.window() 用于切换到相应的窗口，与上一节的switch_to.frame()类似，前者用于不同窗口的切换，后者用于不同表单之间的切换。&lt;/p&gt;&lt;p&gt;实例演示&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;import time&lt;/p&gt;&lt;p&gt;driver = webdriver.Chrome(&amp;quot;F:\Chrome\ChromeDriver\chromedriver&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.implicitly_wait(10)&lt;/p&gt;&lt;p&gt;driver.get(&amp;quot;http://www.baidu.com&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#1.获得百度搜索窗口句柄&lt;/p&gt;&lt;p&gt;sreach_windows = driver.current_window_handle&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.find_element_by_link_text(&amp;#39;登录&amp;#39;).click()&lt;/p&gt;&lt;p&gt;driver.find_element_by_link_text(&amp;quot;立即注册&amp;quot;).click()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#1.获得当前所有打开的窗口的句柄&lt;/p&gt;&lt;p&gt;all_handles = driver.window_handles&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#3.进入注册窗口&lt;/p&gt;&lt;p&gt;for handle in all_handles:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if handle != sreach_windows:&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; driver.switch_to.window(handle)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&amp;#39;跳转到注册窗口&amp;#39;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; driver.find_element_by_name(&amp;quot;account&amp;quot;).send_keys(&amp;#39;123456789&amp;#39;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; driver.find_element_by_name(&amp;#39;password&amp;#39;).send_keys(&amp;#39;123456789&amp;#39;)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; time.sleep(2)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;driver.quit()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12&lt;/p&gt;&lt;p&gt;13&lt;/p&gt;&lt;p&gt;14&lt;/p&gt;&lt;p&gt;15&lt;/p&gt;&lt;p&gt;16&lt;/p&gt;&lt;p&gt;17&lt;/p&gt;&lt;p&gt;18&lt;/p&gt;&lt;p&gt;19&lt;/p&gt;&lt;p&gt;20&lt;/p&gt;&lt;p&gt;21&lt;/p&gt;&lt;p&gt;22&lt;/p&gt;&lt;p&gt;23&lt;/p&gt;&lt;p&gt;24&lt;/p&gt;&lt;p&gt;25&lt;/p&gt;&lt;p&gt;9.警告框处理&lt;/p&gt;&lt;p&gt;在WebDriver中处理JavaScript所生成的alert、confirm以及prompt十分简单，具体做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt，然后使用text/accept/dismiss/ send_keys等方法进行操作。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方法 说明&lt;/p&gt;&lt;p&gt;text 返回 alert/confirm/prompt 中的文字信息&lt;/p&gt;&lt;p&gt;accept() 接受现有警告框&lt;/p&gt;&lt;p&gt;dismiss() 解散现有警告框&lt;/p&gt;&lt;p&gt;send_keys(keysToSend) 发送文本至警告框。keysToSend：将文本发送至警告框。&lt;/p&gt;&lt;p&gt;实例演示&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;from selenium.webdriver.common.action_chains import ActionChains&lt;/p&gt;&lt;p&gt;import time&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver = webdriver.Chrome(&amp;quot;F:\Chrome\ChromeDriver\chromedriver&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.implicitly_wait(10)&lt;/p&gt;&lt;p&gt;driver.get(&amp;#39;http://www.baidu.com&amp;#39;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 鼠标悬停至“设置”链接&lt;/p&gt;&lt;p&gt;link = driver.find_element_by_link_text(&amp;#39;设置&amp;#39;)&lt;/p&gt;&lt;p&gt;ActionChains(driver).move_to_element(link).perform()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 打开搜索设置&lt;/p&gt;&lt;p&gt;driver.find_element_by_link_text(&amp;quot;搜索设置&amp;quot;).click()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#在此处设置等待2s否则可能报错&lt;/p&gt;&lt;p&gt;time.sleep(2)&lt;/p&gt;&lt;p&gt;# 保存设置&lt;/p&gt;&lt;p&gt;driver.find_element_by_class_name(&amp;quot;prefpanelgo&amp;quot;).click()&lt;/p&gt;&lt;p&gt;time.sleep(2)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 接受警告框&lt;/p&gt;&lt;p&gt;driver.switch_to.alert.accept()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.quit()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12&lt;/p&gt;&lt;p&gt;13&lt;/p&gt;&lt;p&gt;14&lt;/p&gt;&lt;p&gt;15&lt;/p&gt;&lt;p&gt;16&lt;/p&gt;&lt;p&gt;17&lt;/p&gt;&lt;p&gt;18&lt;/p&gt;&lt;p&gt;19&lt;/p&gt;&lt;p&gt;20&lt;/p&gt;&lt;p&gt;21&lt;/p&gt;&lt;p&gt;22&lt;/p&gt;&lt;p&gt;23&lt;/p&gt;&lt;p&gt;24&lt;/p&gt;&lt;p&gt;25&lt;/p&gt;&lt;p&gt;26&lt;/p&gt;&lt;p&gt;27&lt;/p&gt;&lt;p&gt;10.下拉框选择操作&lt;/p&gt;&lt;p&gt;导入选择下拉框Select类，使用该类处理下拉框操作。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium.webdriver.support.select import Select&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;Select类的方法&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方法 说明&lt;/p&gt;&lt;p&gt;select_by_value(“选择值”) select标签的value属性的值&lt;/p&gt;&lt;p&gt;select_by_index(“索引值”) 下拉框的索引&lt;/p&gt;&lt;p&gt;select_by_visible_testx(“文本值”) 下拉框的文本值&lt;/p&gt;&lt;p&gt;有时我们会碰到下拉框，WebDriver提供了Select类来处理下拉框。 如百度搜索设置的下拉框，如下图：&lt;/p&gt;&lt;p&gt;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WUxrkEj-1571973999629)(http://orru5lls3.bkt.clouddn.com/select.png)]&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;from selenium.webdriver.support.select import Select&lt;/p&gt;&lt;p&gt;from time import sleep&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver = webdriver.Chrome(&amp;quot;F:\Chrome\ChromeDriver\chromedriver&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.implicitly_wait(10)&lt;/p&gt;&lt;p&gt;driver.get(&amp;#39;http://www.baidu.com&amp;#39;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#1.鼠标悬停至“设置”链接&lt;/p&gt;&lt;p&gt;driver.find_element_by_link_text(&amp;#39;设置&amp;#39;).click()&lt;/p&gt;&lt;p&gt;sleep(1)&lt;/p&gt;&lt;p&gt;#2.打开搜索设置&lt;/p&gt;&lt;p&gt;driver.find_element_by_link_text(&amp;quot;搜索设置&amp;quot;).click()&lt;/p&gt;&lt;p&gt;sleep(2)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#3.搜索结果显示条数&lt;/p&gt;&lt;p&gt;sel = driver.find_element_by_xpath(&amp;quot;//select[@id=&amp;#39;nr&amp;#39;]&amp;quot;)&lt;/p&gt;&lt;p&gt;Select(sel).select_by_value(&amp;#39;50&amp;#39;)&amp;nbsp; # 显示50条&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;sleep(3)&lt;/p&gt;&lt;p&gt;driver.quit()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12&lt;/p&gt;&lt;p&gt;13&lt;/p&gt;&lt;p&gt;14&lt;/p&gt;&lt;p&gt;15&lt;/p&gt;&lt;p&gt;16&lt;/p&gt;&lt;p&gt;17&lt;/p&gt;&lt;p&gt;18&lt;/p&gt;&lt;p&gt;19&lt;/p&gt;&lt;p&gt;20&lt;/p&gt;&lt;p&gt;21&lt;/p&gt;&lt;p&gt;11.文件上传&lt;/p&gt;&lt;p&gt;对于通过input标签实现的上传功能，可以将其看作是一个输入框，即通过send_keys()指定本地文件路径的方式实现文件上传。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;通过send_keys()方法来实现文件上传:&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;import os&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver = webdriver.Firefox()&lt;/p&gt;&lt;p&gt;file_path = &amp;#39;file:///&amp;#39; + os.path.abspath(&amp;#39;upfile.html&amp;#39;)&lt;/p&gt;&lt;p&gt;driver.get(file_path)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 定位上传按钮，添加本地文件&lt;/p&gt;&lt;p&gt;driver.find_element_by_name(&amp;quot;file&amp;quot;).send_keys(&amp;#39;D:\\upload_file.txt&amp;#39;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.quit()&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12.cookie操作&lt;/p&gt;&lt;p&gt;有时候我们需要验证浏览器中cookie是否正确，因为基于真实cookie的测试是无法通过白盒和集成测试进行的。WebDriver提供了操作Cookie的相关方法，可以读取、添加和删除cookie信息。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;WebDriver操作cookie的方法:&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方法 说明&lt;/p&gt;&lt;p&gt;get_cookies() 获得所有cookie信息&lt;/p&gt;&lt;p&gt;get_cookie(name) 返回字典的key为“name”的cookie信息&lt;/p&gt;&lt;p&gt;add_cookie(cookie_dict) 添加cookie。“cookie_dict”指字典对象，必须有name 和value 值&lt;/p&gt;&lt;p&gt;delete_cookie(name,optionsString) 删除cookie信息。“name”是要删除的cookie的名称，“optionsString”是该cookie的选项，目前支持的选项包括“路径”，“域”&lt;/p&gt;&lt;p&gt;delete_all_cookies() 删除所有cookie信息&lt;/p&gt;&lt;p&gt;实例演示&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;import time&lt;/p&gt;&lt;p&gt;browser = webdriver.Chrome(&amp;quot;F:\Chrome\ChromeDriver\chromedriver&amp;quot;)&lt;/p&gt;&lt;p&gt;browser.get(&amp;quot;http://www.youdao.com&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#1.打印cookie信息&lt;/p&gt;&lt;p&gt;print(&amp;#39;=====================================&amp;#39;)&lt;/p&gt;&lt;p&gt;print(&amp;quot;打印cookie信息为：&amp;quot;)&lt;/p&gt;&lt;p&gt;print(browser.get_cookies)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#2.添加cookie信息&lt;/p&gt;&lt;p&gt;dict={&amp;#39;name&amp;#39;:&amp;quot;name&amp;quot;,&amp;#39;value&amp;#39;:&amp;#39;Kaina&amp;#39;}&lt;/p&gt;&lt;p&gt;browser.add_cookie(dict)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;print(&amp;#39;=====================================&amp;#39;)&lt;/p&gt;&lt;p&gt;print(&amp;#39;添加cookie信息为：&amp;#39;)&lt;/p&gt;&lt;p&gt;#3.遍历打印cookie信息&lt;/p&gt;&lt;p&gt;for cookie in browser.get_cookies():&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; print(&amp;#39;%s----%s\n&amp;#39; %(cookie[&amp;#39;name&amp;#39;],cookie[&amp;#39;value&amp;#39;]))&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;#4.删除一个cookie&lt;/p&gt;&lt;p&gt;browser.delete_cookie(&amp;#39;name&amp;#39;)&lt;/p&gt;&lt;p&gt;print(&amp;#39;=====================================&amp;#39;)&lt;/p&gt;&lt;p&gt;print(&amp;#39;删除一个cookie&amp;#39;)&lt;/p&gt;&lt;p&gt;for cookie in browser.get_cookies():&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; print(&amp;#39;%s----%s\n&amp;#39; %(cookie[&amp;#39;name&amp;#39;],cookie[&amp;#39;value&amp;#39;]))&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;print(&amp;#39;=====================================&amp;#39;)&lt;/p&gt;&lt;p&gt;print(&amp;#39;删除所有cookie后：&amp;#39;)&lt;/p&gt;&lt;p&gt;#5.删除所有cookie,无需传递参数&lt;/p&gt;&lt;p&gt;browser.delete_all_cookies()&lt;/p&gt;&lt;p&gt;for cookie in browser.get_cookies():&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; print(&amp;#39;%s----%s\n&amp;#39; %(cookie[&amp;#39;name&amp;#39;],cookie[&amp;#39;value&amp;#39;]))&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;time.sleep(3)&lt;/p&gt;&lt;p&gt;browser.close()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12&lt;/p&gt;&lt;p&gt;13&lt;/p&gt;&lt;p&gt;14&lt;/p&gt;&lt;p&gt;15&lt;/p&gt;&lt;p&gt;16&lt;/p&gt;&lt;p&gt;17&lt;/p&gt;&lt;p&gt;18&lt;/p&gt;&lt;p&gt;19&lt;/p&gt;&lt;p&gt;20&lt;/p&gt;&lt;p&gt;21&lt;/p&gt;&lt;p&gt;22&lt;/p&gt;&lt;p&gt;23&lt;/p&gt;&lt;p&gt;24&lt;/p&gt;&lt;p&gt;25&lt;/p&gt;&lt;p&gt;26&lt;/p&gt;&lt;p&gt;27&lt;/p&gt;&lt;p&gt;28&lt;/p&gt;&lt;p&gt;29&lt;/p&gt;&lt;p&gt;30&lt;/p&gt;&lt;p&gt;31&lt;/p&gt;&lt;p&gt;32&lt;/p&gt;&lt;p&gt;33&lt;/p&gt;&lt;p&gt;34&lt;/p&gt;&lt;p&gt;35&lt;/p&gt;&lt;p&gt;36&lt;/p&gt;&lt;p&gt;37&lt;/p&gt;&lt;p&gt;13.调用JavaScript代码&lt;/p&gt;&lt;p&gt;虽然WebDriver提供了操作浏览器的前进和后退方法，但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下，就可以借助JavaScript来控制浏览器的滚动条。WebDriver提供了execute_script()方法来执行JavaScript代码。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;用于调整浏览器滚动条位置的JavaScript代码如下：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;!-- window.scrollTo(左边距,上边距); --&amp;gt;&lt;/p&gt;&lt;p&gt;window.scrollTo(0,450);&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距，第二个参数表示垂直的上边距。其代码如下：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;from time import sleep&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#1.访问百度&lt;/p&gt;&lt;p&gt;driver=webdriver.Firefox(executable_path =&amp;quot;F:\GeckoDriver\geckodriver&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.get(&amp;quot;http://www.baidu.com&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#2.搜索&lt;/p&gt;&lt;p&gt;driver.find_element_by_id(&amp;quot;kw&amp;quot;).send_keys(&amp;quot;selenium&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.find_element_by_id(&amp;quot;su&amp;quot;).click()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#3.休眠2s目的是获得服务器的响应内容，如果不使用休眠可能报错&lt;/p&gt;&lt;p&gt;sleep(2)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#4.通过javascript设置浏览器窗口的滚动条位置&lt;/p&gt;&lt;p&gt;js=&amp;quot;window.scrollTo(100,450);&amp;quot;&lt;/p&gt;&lt;p&gt;driver.execute_script(js)&lt;/p&gt;&lt;p&gt;sleep(3)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.close()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1&lt;/p&gt;&lt;p&gt;2&lt;/p&gt;&lt;p&gt;3&lt;/p&gt;&lt;p&gt;4&lt;/p&gt;&lt;p&gt;5&lt;/p&gt;&lt;p&gt;6&lt;/p&gt;&lt;p&gt;7&lt;/p&gt;&lt;p&gt;8&lt;/p&gt;&lt;p&gt;9&lt;/p&gt;&lt;p&gt;10&lt;/p&gt;&lt;p&gt;11&lt;/p&gt;&lt;p&gt;12&lt;/p&gt;&lt;p&gt;13&lt;/p&gt;&lt;p&gt;14&lt;/p&gt;&lt;p&gt;15&lt;/p&gt;&lt;p&gt;16&lt;/p&gt;&lt;p&gt;17&lt;/p&gt;&lt;p&gt;18&lt;/p&gt;&lt;p&gt;19&lt;/p&gt;&lt;p&gt;20&lt;/p&gt;&lt;p&gt;通过浏览器打开百度进行搜索，并且提前通过set_window_size()方法将浏览器窗口设置为固定宽高显示，目的是让窗口出现水平和垂直滚动条。然后通过execute_script()方法执行JavaScripts代码来移动滚动条的位置。&lt;/p&gt;&lt;p&gt;滚动条上下左右滚动代码演示&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;from time import sleep&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver=webdriver.Firefox(executable_path =&amp;quot;F:\GeckoDriver\geckodriver&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.set_window_size(400,400)&lt;/p&gt;&lt;p&gt;driver.get(&amp;quot;https://www.baidu.com&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#2.搜索&lt;/p&gt;&lt;p&gt;# driver.find_element_by_id(&amp;quot;kw&amp;quot;).send_keys(&amp;quot;selenium&amp;quot;)&lt;/p&gt;&lt;p&gt;# driver.find_element_by_id(&amp;quot;su&amp;quot;).click()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#3.休眠2s目的是获得服务器的响应内容，如果不使用休眠可能报错&lt;/p&gt;&lt;p&gt;sleep(10)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#4 滚动左右滚动条---向右&lt;/p&gt;&lt;p&gt;js2 = &amp;quot;var q=document.documentElement.scrollLeft=10000&amp;quot;&lt;/p&gt;&lt;p&gt;driver.execute_script(js2)&lt;/p&gt;&lt;p&gt;sleep(15)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#5 滚动左右滚动条---向左&lt;/p&gt;&lt;p&gt;js3 = &amp;quot;var q=document.documentElement.scrollLeft=0&amp;quot;&lt;/p&gt;&lt;p&gt;driver.execute_script(js3)&lt;/p&gt;&lt;p&gt;sleep(15)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#6 拖动到滚动条底部---向下&lt;/p&gt;&lt;p&gt;js = &amp;quot;var q=document.documentElement.scrollTop=10000&amp;quot;&lt;/p&gt;&lt;p&gt;driver.execute_script(js)&lt;/p&gt;&lt;p&gt;sleep(15)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#7 拖动到滚动条底部---向上&lt;/p&gt;&lt;p&gt;js = &amp;quot;var q=document.documentElement.scrollTop=0&amp;quot;&lt;/p&gt;&lt;p&gt;driver.execute_script(js)&lt;/p&gt;&lt;p&gt;sleep(15)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.close()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;14.窗口截图&lt;/p&gt;&lt;p&gt;自动化用例是由程序去执行的，因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存，那么通过图片就可以非常直观地看出出错的原因。WebDriver提供了截图函数get_screenshot_as_file()来截取当前窗口。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;截屏方法：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方法 说明&lt;/p&gt;&lt;p&gt;get_screenshot_as_file(self, filename) 用于截取当前窗口，并把图片保存到本地&lt;/p&gt;&lt;p&gt;from selenium import webdriver&lt;/p&gt;&lt;p&gt;from time import sleep&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver =webdriver.Firefox(executable_path =&amp;quot;F:\GeckoDriver\geckodriver&amp;quot;)&lt;/p&gt;&lt;p&gt;driver.get(&amp;#39;http://www.baidu.com&amp;#39;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.find_element_by_id(&amp;#39;kw&amp;#39;).send_keys(&amp;#39;selenium&amp;#39;)&lt;/p&gt;&lt;p&gt;driver.find_element_by_id(&amp;#39;su&amp;#39;).click()&lt;/p&gt;&lt;p&gt;sleep(2)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#1.截取当前窗口，并指定截图图片的保存位置&lt;/p&gt;&lt;p&gt;driver.get_screenshot_as_file(&amp;quot;D:\\baidu_img.jpg&amp;quot;)&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;driver.quit()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;15.关闭浏览器&lt;/p&gt;&lt;p&gt;在前面的例子中我们一直使用quit()方法，其含义为退出相关的驱动程序和关闭所有窗口。除此之外，WebDriver还提供了close()方法，用来关闭当前窗口。例多窗口的处理，在用例执行的过程中打开了多个窗口，我们想要关闭其中的某个窗口，这时就要用到close()方法进行关闭了。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方法 说明&lt;/p&gt;&lt;p&gt;close() 关闭单个窗口&lt;/p&gt;&lt;p&gt;quit() 关闭所有窗口&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 27 Apr 2022 22:16:02 +0800</pubDate></item><item><title>安装时报错的处理</title><link>http://27.45.230.218/?id=15</link><description>&lt;p&gt;&lt;span data-shimo-docs=&quot;[[20,&amp;quot;ubuntu 16.04 环境下 使用 sudo apt-get install命令安装软件包时，会出现&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;ruWQ\&amp;quot;&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;ucf1\&amp;quot;&amp;quot;],[20,&amp;quot;dpkg：error processing package XXX (--configure):&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;qIN1\&amp;quot;&amp;quot;],[20,&amp;quot;subprocess installed post-installation script returned error exit status 10&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;bwwJ\&amp;quot;&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;ns1G\&amp;quot;&amp;quot;],[20,&amp;quot;这种报错信息，其中XXX是表示某个包，比如我遇到的就是r-base-core这个包报错，解决方法如下&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;oKgt\&amp;quot;&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;J37R\&amp;quot;&amp;quot;],[20,&amp;quot;sudo rm /var/lib/dpkg/info/r-base-core*&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;WZrm\&amp;quot;&amp;quot;],[20,&amp;quot;sudo dpkg --configure -D 777 r-base-core&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;p2W2\&amp;quot;&amp;quot;],[20,&amp;quot;sudo apt -f install&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;pSEM\&amp;quot;&amp;quot;],[20,&amp;quot;\n&amp;quot;,&amp;quot;24:\&amp;quot;ehPC\&amp;quot;&amp;quot;],[20,&amp;quot;大家根据自己的情况，可以把r-base-core改成自己报错的那个包，如果有多个包报错，目前看起来只能不断重复这个过程，来依次解决。&amp;quot;]]&quot;&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;ruWQ&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;ubuntu 16.04 环境下 使用 sudo apt-get install命令安装软件包时，会出现&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;ucf1&quot; ql-global=&quot;true&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;qIN1&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;dpkg：error processing package XXX (--configure):&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;bwwJ&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;subprocess installed post-installation script returned error exit status 10&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;ns1G&quot; ql-global=&quot;true&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;oKgt&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;这种报错信息，其中XXX是表示某个包，比如我遇到的就是r-base-core这个包报错，解决方法如下&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;J37R&quot; ql-global=&quot;true&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;WZrm&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;sudo rm /var/lib/dpkg/info/r-base-core*&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;p2W2&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;sudo dpkg --configure -D 777 r-base-core&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;pSEM&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;sudo apt -f install&lt;/span&gt;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;ehPC&quot; ql-global=&quot;true&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p ql-global-para=&quot;true&quot; line=&quot;ufbr&quot; class=&quot;ql-long-16199440&quot; style=&quot;line-height: 100%;margin-bottom: 0pt;margin-top: 0pt;font-size: 11pt;color: #494949;&quot;&gt;&lt;span class=&quot;ql-author-16199440&quot; ql-global=&quot;true&quot;&gt;大家根据自己的情况，可以把r-base-core改成自己报错的那个包，如果有多个包报错，目前看起来只能不断重复这个过程，来依次解决。&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Wed, 27 Apr 2022 22:02:50 +0800</pubDate></item><item><title>OpenCV模板匹配算法详解</title><link>http://27.45.230.218/?id=14</link><description>&lt;p&gt;模板匹配是在一幅图像中寻找一个特定目标的方法之一，这种方法的原理非常简单，遍历图像中的每一个可能的位置，比较各处与模板是否“相似”，当相似度足够高时，就认为找到了我们的目标。OpenCV提供了6种模板匹配算法：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;平方差匹配法CV_TM_SQDIFF&lt;/p&gt;&lt;p&gt;归一化平方差匹配法CV_TM_SQDIFF_NORMED&lt;/p&gt;&lt;p&gt;相关匹配法CV_TM_CCORR&lt;/p&gt;&lt;p&gt;归一化相关匹配法CV_TM_CCORR_NORMED&lt;/p&gt;&lt;p&gt;相关系数匹配法CV_TM_CCOEFF&lt;/p&gt;&lt;p&gt;归一化相关系数匹配法CV_TM_CCOEFF_NORMED&lt;/p&gt;&lt;p&gt;用T表示模板图像，I表示待匹配图像，切模板图像的宽为w高为h，用R表示匹配结果，匹配过程如下图所示：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;上述6中匹配方法可用以下公式进行描述：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;较新版本的OpenCV库中的模板匹配已经进行了较多的算法改进，直接看新版本中的算法需要了解很多相关理论知识，所以我们结合OpenCV0.9.5的源码进行讲解，该版本的源码基本上是C风格代码，对于初学者来说更容易进行理解（如果要对OpenCV源码进行研究，建议用该版本进行入门），下面以第6项归一化相关系数匹配法为例进行分析。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;源码部分及注解&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;/******************参数说明****************************&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;* pImage: 待匹配图像数据，相对要大于或等于模板图像的宽和高&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;* imageStep: 待匹配图像宽（width*depth并以4字节对齐）&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;* roiSize: 待匹配图像尺寸&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;* pTemplate: 模板图像数据（在大图pImage里去找这个模板pTemplate图像）&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;* templStep: 模板图像宽&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;* templSize: 模板图像尺寸&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;* pResult: 匹配结果&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;* resultStep: 匹配结果宽&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;* pBuffer: 中间结果数据缓存&lt;/p&gt;&lt;p&gt;&amp;nbsp; */&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; IPCVAPI_IMPL( CvStatus, icvMatchTemplate_CoeffNormed_32f_C1R,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (const float *pImage, int imageStep, CvSize roiSize,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const float *pTemplate, int templStep, CvSize templSize,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;float *pResult, int resultStep, void *pBuffer) )&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; float *imgBuf = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 待匹配图像相关数据&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; float *templBuf = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 模板图像数据&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; double *sumBuf = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 待匹配图像遍历块单行和&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; double *sqsumBuf = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 待匹配图像遍历块单行平方和&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; double *resNum = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 模板图像和待匹配图像遍历块内积&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; double *resDenom = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 待匹配图像遍历块累加和及待匹配图像遍历块平方累加和&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; double templCoeff = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 模板图像均分差倒数&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; double templSum = 0;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 模板图像累加和&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; int winLen = templSize.width * templSize.height;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; double winCoeff = 1. / (winLen + DBL_EPSILON);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // + DBL_EPSILON 加一个小整数防止分母为零&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; CvSize resultSize = cvSize( roiSize.width - templSize.width + 1,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; roiSize.height - templSize.height + 1 );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; int x, y;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; // 计算imgBuf、templBuf、sumBuf、sqsumBuf、resNum、resDenom大小并分配存储空间&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; CvStatus result = icvMatchTemplateEntry( pImage, imageStep, roiSize,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pTemplate, templStep, templSize,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pResult, resultStep, pBuffer,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cv32f, 1, 1,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(void **) &amp;amp;imgBuf, (void **) &amp;amp;templBuf,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(void **) &amp;amp;sumBuf, (void **) &amp;amp;sqsumBuf,&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(void **) &amp;amp;resNum, (void **) &amp;amp;resDenom );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if( result != CV_OK )&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return result;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; imageStep /= sizeof_float;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; templStep /= sizeof_float;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; resultStep /= sizeof_float;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /* calc common statistics for template and image */&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const float *rowPtr = (const float *) imgBuf;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double templSqsum = icvCrossCorr_32f_C1( templBuf, templBuf, winLen );&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 模板图像平方累加和 Sqsum +=I（x,y）*I(x,y)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; templSum = icvSumPixels_32f_C1( templBuf, winLen );&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 模板图像累加和&amp;nbsp; Sum +=I(x,y)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; templCoeff = (double) templSqsum - ((double) templSum) * templSum * winCoeff;&amp;nbsp; &amp;nbsp;// 模板图像均方差的平方//templCoeff = sum(I(x,y)*I(x,y))-(sum(I(x,y))*sum(I(x,y)/width*height&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; templCoeff = icvInvSqrt64d( fabs( templCoeff ) + FLT_EPSILON );&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 模板图像均方差倒数 //正好是公式6分母的左半部分&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //下面按每rows 进行滑动，Mat里的rows,相对于图像的height，有效区域是模板的大小&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for( y = 0; y &amp;lt; roiSize.height; y++, rowPtr += templSize.width )&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sumBuf[y] = icvSumPixels_32f_C1( rowPtr, templSize.width );&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 待匹配图像按模板图像宽度求每行之和（遍历位置第一列）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sqsumBuf[y] = icvCrossCorr_32f_C1( rowPtr, rowPtr, templSize.width );&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 待匹配图像按模板图像宽度求每行平方之和（遍历位置第一列）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /* main loop - through x coordinate of the result从结果矩阵result的x坐标进行滑动*/&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; for( x = 0; x &amp;lt; resultSize.width; x++ )&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double sum = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double sqsum = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float *imgPtr = imgBuf + x;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 待匹配图像内存部分的起始位置&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* update sums and image band buffer */&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 如果不是第0列需重新更新sumBuf，sqsumBuf[y]，更新后sumBuf为遍历位置第x列每行之和（行宽为模板图像宽）相当于最左边一列数据要随着x滑动需要实时更新。更新方法就是新的最右边一列数据减去老的最左边的一列数据就可以了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if( x &amp;gt; 0 )&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; const float *src = pImage + x + templSize.width - 1; //图像数据源起始地址&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;float *dst = imgPtr - 1;&amp;nbsp; // float *imgPtr = imgBuf + x;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;float out_val = dst[0]; //这次模板宽度起始的位置的前一个像素&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dst += templSize.width;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for( y = 0; y &amp;lt; roiSize.height; y++, src += imageStep, dst += templSize.width )&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; float in_val = src[0];//原图(x，y)的数据&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sumBuf[y] += in_val - out_val;//求原图像一列的像素差值总和&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sqsumBuf[y] += (in_val - out_val) * (in_val + out_val);//x^2-y^2&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; out_val = dst[0];//作为上一行的数据&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dst[0] = (float) in_val; //设置dst[0]&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for( y = 0; y &amp;lt; templSize.height; y++ )&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 单独求遍历位置第x列，遍历块累加和sum及平方差累加和sqsum&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sum += sumBuf[y];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sqsum += sqsumBuf[y];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//对x列下y行部分进行预先处理&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for( y = 0; y &amp;lt; resultSize.height; y++, imgPtr += templSize.width )&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;double res = icvCrossCorr_32f_C1( imgPtr, templBuf, winLen );&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 求模板图像和待匹配图像y行x列处遍历块的内积 //res +=imgPtr(x,y)*templBuf(x,y)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;//分子左上部分卷积&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if( y &amp;gt; 0 )&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 如果不是第0行需更新遍历块累加和sum及平方累加和sqsum&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 更新方法是新的最下面一行减去老的最上面一行就可以了&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sum -= sumBuf[y - 1];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sum += sumBuf[y + templSize.height - 1];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sqsum -= sqsumBuf[y - 1];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sqsum += sqsumBuf[y + templSize.height - 1];&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;resNum[y] = res;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;resDenom[y] = sum;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;resDenom[y + resultSize.height] = sqsum;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//进行最后汇总计算，基于x列滑动的结果再进行结果矩阵的y行列滑动&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for( y = 0; y &amp;lt; resultSize.height; y++ )&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;double sum = ((double) resDenom[y]);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;double wsum = winCoeff * sum;//分子右半部分第一项&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;double res = ((double) resNum[y]) - wsum * templSum; //公式6的分子部分&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// wsum * templSum 表示分子右半部分;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;double nrm_s = ((double) resDenom[y + resultSize.height]) - wsum * sum;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//上面表示分母右边开根号里的内容 （I(x,y)*I(x,y)）-1/width/height*sum(temp(x,y))*sum(temp(x,y))&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;res *= templCoeff * icvInvSqrt64d( fabs( nrm_s ) + FLT_EPSILON );&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //公式6的分母右半部分&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pResult[x + y * resultStep] = (float) res;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //把结果相似度值存入结果矩阵x列y行中&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return CV_OK;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><pubDate>Wed, 27 Apr 2022 22:01:40 +0800</pubDate></item><item><title>ubuntu 16.04 利用samba 共享移动硬盘</title><link>http://27.45.230.218/?id=13</link><description>&lt;p&gt;Windows 下面如何访问到ubuntu 下的一个移动硬盘呢，一开始当然是考虑到samba 这个工具了。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 没有什么好说的，立即安装一个samba&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;sudo apt-get install samba&lt;/p&gt;&lt;p&gt;添加系统用户账户&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;sudo adduser samba_user1&lt;/p&gt;&lt;p&gt;添加samba 共享用户账户&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;sudo smbpasswd -a samba_user1&lt;/p&gt;&lt;p&gt;按照 通用的去配置 smb.cnf,添加共享u disk 方法。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;sudo vi /etc/samba/smb.cnf&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;[u_disk]&lt;/p&gt;&lt;p&gt;comment = share removable hardware disk&lt;/p&gt;&lt;p&gt;path = /media/xxxx/Elements/&lt;/p&gt;&lt;p&gt;public = yes&lt;/p&gt;&lt;p&gt;writable = yes&lt;/p&gt;&lt;p&gt;valid_users = samba_user1&lt;/p&gt;&lt;p&gt;force user&amp;nbsp; = samba_user1&lt;/p&gt;&lt;p&gt;available = yes&lt;/p&gt;&lt;p&gt;browseable =yes&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;unix charset= UTF-8&lt;/p&gt;&lt;p&gt;dos charset= cp936&lt;/p&gt;&lt;p&gt;在 windows 端能看到u_disk共享名,但是就是无法点击进入访问，增加了 force user = samba_user1 也是一样的效果，无法访问，有权限的问题。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;后来测试在home 目录下去通过samba 去共享一些目录，访问时是没有问题的。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;这说明smb.cnf 配置应该是没有问题，问题可能还是u disk 的配置导致了访问错误。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;后来参考了Cloud Chou 关于 树莓派共享硬盘的方案。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;新建文件/etc/udev/rules.d/99-udisks2.rules,内容如下:&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# By default, udisks2 mounts removable drives under the ACL controlled directory&amp;nbsp;&lt;/p&gt;&lt;p&gt;# /run/media/$USER/. If you wish to mount to /media instead, use this rule:&lt;/p&gt;&lt;p&gt;# set DISKS_FILESYSTEM_SHARED =1&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;# UDISKS_FILESYSTEM_SHARED&lt;/p&gt;&lt;p&gt;# ==1: mount filesystem to a shared directory (/media/VolumeName)&lt;/p&gt;&lt;p&gt;# ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName)&lt;/p&gt;&lt;p&gt;# See udisks(8)&lt;/p&gt;&lt;p&gt;ENV{ID_FS_USAGE}==&amp;quot;filesystem|other|crypto&amp;quot;, ENV{UDISKS_FILESYSTEM_SHARED}=&amp;quot;1&amp;quot;&lt;/p&gt;&lt;p&gt;绑定挂载&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;sudo apt-get install bindfs&lt;/p&gt;&lt;p&gt;然后创建新的挂载点，并利用bindfs进行绑定挂载:&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;sudo mkdir /mnt/media&lt;/p&gt;&lt;p&gt;bindfs -o perms=0775 /media /mnt/media&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这样新挂载点/mnt/media的权限就是0775，任何用户都可以访问了, 不过这只是临时挂载, 可以通过修改/etc/rc.local文件来实现开机时自动挂载，代码如下所示:&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# ...&lt;/p&gt;&lt;p&gt;bindfs -o perms=0775 /media /mnt/media&lt;/p&gt;&lt;p&gt;exit 0&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;最后修改samba配置文件smb.cnf，让其在局域网内共享,修改path=/mnt/media/xxxx/Elements/&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;[u_disk]&lt;/p&gt;&lt;p&gt;comment = share removable hardware disk&lt;/p&gt;&lt;p&gt;path = /mnt/media/xxxx/Elements/&lt;/p&gt;&lt;p&gt;public = yes&lt;/p&gt;&lt;p&gt;writable = yes&lt;/p&gt;&lt;p&gt;valid_users = samba_user1&lt;/p&gt;&lt;p&gt;force user&amp;nbsp; = samba_user1&lt;/p&gt;&lt;p&gt;available = yes&lt;/p&gt;&lt;p&gt;browseable =yes&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;unix charset= UTF-8&lt;/p&gt;&lt;p&gt;dos charset= cp936&lt;/p&gt;&lt;p&gt;最后重新启动下ubuntu ，再重新连接下共享目录，就可以正常访问了。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 27 Apr 2022 22:00:30 +0800</pubDate></item><item><title>手把手-安装-packer</title><link>http://27.45.230.218/?id=12</link><description>&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;操作系统&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;Centos 7.6 , Ubuntu-19.10&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;硬件配置(推荐)&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;CPU / 内存 : 2核 / 4GB&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;安装版本&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;packer 1.5.4&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;https://releases.hashicorp.com/packer/1.5.4/packer_1.5.4_linux_amd64.zip&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 27 Apr 2022 21:59:22 +0800</pubDate></item><item><title>手把手-安装-jdk</title><link>http://27.45.230.218/?id=11</link><description>&lt;div id=&quot;cnblogs_post_body&quot; class=&quot;blogpost-body blogpost-body-html&quot; style=&quot;margin: 0px 0px 20px; padding: 0px; word-break: break-word; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;操作系统&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;Centos 7.6 , Ubuntu-19.10&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;硬件配置(推荐)&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;&amp;nbsp;CPU / 内存 : 2核 / 4GB&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;安装版本&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;jdk 14&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;&lt;a href=&quot;https://www.oracle.com/java/technologies/javase-jdk14-downloads.html&quot; rel=&quot;noopener&quot; style=&quot;margin: 0px; padding: 0px; outline: none; color: rgb(0, 0, 0);&quot;&gt;https://www.oracle.com/java/technologies/javase-jdk14-downloads.html&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;开始安装&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;首先下载安装包&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;jdk-14_linux-x64_bin.tar.gz&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;解压安装包&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;tar&amp;nbsp;-xzvf&amp;nbsp;jdk-14_linux-x64_bin.tar.gz&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;移动文件夹jdk-14到/usr/jvm/jdk-14目录&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;mv&amp;nbsp;jdk-14&amp;nbsp;/usr/jvm&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;配置环境变量&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;vi&amp;nbsp;/etc/profile&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;JAVA_HOME=/usr/jvm/jdk-14CLASSPATH=$JAVA_HOME/lib/PATH=$PATH:$JAVA_HOME/bin
export&amp;nbsp;PATH&amp;nbsp;JAVA_HOME&amp;nbsp;CLASSPATH&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;重启后生效&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;reboot&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px;&quot;&gt;查看Java版本&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;java&amp;nbsp;-version&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;clear&quot; style=&quot;margin: 0px; padding: 0px; clear: both; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;/div&gt;&lt;div id=&quot;blog_post_info_block&quot; role=&quot;contentinfo&quot; style=&quot;margin: 20px 0px 0px; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;div id=&quot;BlogPostCategory&quot; style=&quot;margin: 0px 0px 10px; padding: 0px; color: rgb(102, 102, 102);&quot;&gt;&lt;br/&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 27 Apr 2022 21:58:48 +0800</pubDate></item><item><title>手把手-安装-nodejs</title><link>http://27.45.230.218/?id=10</link><description>&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;操作系统&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;Centos 7.6 , Ubuntu-19.10&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;硬件配置(推荐)&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;CPU / 内存 : 2核 / 4GB&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;安装版本&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;nodejs 12.16.1&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;开始安装&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;首先下载安装包&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;wget&amp;nbsp;https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;解压安装包&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;xz&amp;nbsp;-d&amp;nbsp;node-v12.16.1-linux-x64.tar.xz&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;tar&amp;nbsp;-xvf&amp;nbsp;node-v12.16.1-linux-x64.tar&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;移动文件夹node-v12.16.1-linux-x64到/usr/nodejs目录&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;mv&amp;nbsp;node-v12.16.1-linux-x64&amp;nbsp;/usr/nodejs/&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;配置环境变量&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;vi&amp;nbsp;/etc/profile&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;export&amp;nbsp;NODE_HOME=/usr/node-v12.16.1-linux-x64

export&amp;nbsp;PATH=$PATH:$NODE_HOME/bin&lt;/pre&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;export&amp;nbsp;NODE_PATH=$NODE_HOME/lib/node_modules&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;重启后生效&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;reboot&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;查看node和npm版本&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;node&amp;nbsp;-v&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;npm&amp;nbsp;-v&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 27 Apr 2022 21:58:23 +0800</pubDate></item><item><title>手把手-安装-dotnet(sdk)</title><link>http://27.45.230.218/?id=9</link><description>&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;操作系统&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;Centos 7.6 , Ubuntu-19.10&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;&lt;br style=&quot;margin: 0px; padding: 0px;&quot;/&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;硬件配置(推荐)&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;CPU / 内存 : 2核 / 4GB&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;安装版本&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;dotnet(sdk) 3.1.2&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;https://dotnet.microsoft.com/download/dotnet-core/3.1&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;开始安装&lt;/strong&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;首先下载安装包&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;dotnet-sdk-3.1.102-linux-x64.tar.gz&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;解压安装包&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;mkdir&amp;nbsp;dotnet-sdk-3.1.102&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;tar&amp;nbsp;-xvf&amp;nbsp;dotnet-sdk-3.1.102-linux-x64.tar.gz&amp;nbsp;-C&amp;nbsp;dotnet-sdk-3.1.102&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;依赖libunwind和libicu，如果已经安装可以跳过&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;yum&amp;nbsp;-y&amp;nbsp;install&amp;nbsp;libunwind&amp;nbsp;libicu&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;移动文件夹dotnet-sdk-3.1.102到/usr/dotnet-sdk目录&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;mv&amp;nbsp;dotnet-sdk-3.1.102&amp;nbsp;/usr/dotnet-sdk&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;strong style=&quot;margin: 0px; padding: 0px;&quot;&gt;配置环境变量&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;vi&amp;nbsp;/etc/profile&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;export&amp;nbsp;PATH=$PATH:/usr/dotnet-sdk&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;重启后生效&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;reboot&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;查看dotnet版本&lt;/p&gt;&lt;div class=&quot;cnblogs_code&quot; style=&quot;margin: 5px 0px; padding: 5px; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); overflow: auto; white-space: normal; font-family: &amp;quot;Courier New&amp;quot; !important; font-size: 12px !important;&quot;&gt;&lt;pre style=&quot;margin-top: 0px; margin-bottom: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding-top, padding-bottom, margin-top, margin-bottom, color, opacity; overflow: auto; font-family: &amp;quot;Courier New&amp;quot;, serif; overflow-wrap: break-word;&quot;&gt;dotnet&amp;nbsp;--info&lt;/pre&gt;&lt;/div&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Verdana, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 27 Apr 2022 21:57:50 +0800</pubDate></item></channel></rss>