当前位置: 首页 > news >正文

Selenium自动化测试Python二:WebDriver基础

欢迎阅读WebDriver基础讲义。本篇讲义将会重点介绍Selenium WebDriver的环境搭建和基本使用方法。

WebDriver环境搭建

Selenium WebDriver 又称为 Selenium2。

Selenium 1 + WebDriver = Selenium 2

WebDriver是主流Web应用自动化测试框架,具有清晰面向对象 API,能以最佳的方式与浏览器进行交互。

支持的浏览器:

  • Mozilla Firefox
  • Google Chrome
  • Microsoft Internet Explorer
  • Opera
  • Safari
  • Apple iPhone
  • Android browsers

环境搭建步骤

在上一篇中,我们已经确认使用Python来进行WebDriver的编码和操作。事实上Python+Selenium WebDriver环境的搭建分为两个部分:

  1. 安装python
  2. 安装Selenium

标准的安装步骤

选择Python的版本。

Python主流的有两个大的版本,2.7和3.5(请注意,从Python的3.5版本开始,不再支持Windows XP操作系统,Windows XP用户请安装3.4版本)。我们的例子将会选用面向未来的3.5版本。

安装Python。

在Python的官网下载最新的安装包,进行界面安装。https://www.python.org/

安装的时候,推荐选择“Add exe to path”,将会自动添加Python的程序到环境变量中。然后可以在命令行输入python -V检测安装的Python版本。

当前的版本安装中将会默认已经安装了setuptools和pip这两个Python的基本工具。如果使用了比较旧的Python版本的话,需要自行安装这两个工具。

setuptools:Python的基础工具包,用来构建、安装卸载Python程序
pip:Python软件包的安装和管理工具。通过pip可以简单的安装Python的任意类库
安装Selenium2.0版本。

在Windows安装Selenium2.0,有两种途径。使用pip命令行或者源码安装。以下两种方法,使用任何一个均可。推荐pip的方式。

方法一:pip命令行安装,运行 | cmd,打开命令行,-U其实就是–upgrade,升级安装。

pip install -U selenium

方法二:源码解压安装,前往https://pypi.python.org/pypi/selenium下载最新版的PyPI版本的Selenium,解压后执行

python setup.py install

Ubuntu下的环境搭建

在Ubuntu下的Python的解释器一般情况下已经存在了。我们需要打开终端,输入python -V命令进行验证。如果没有安装Python,那么需要去Python官网上下载指定版本的源文件,进行源码安装。安装完了以后并进行环境变量的设置。

安装Selenium WebDriver的方法与上述在Windows环境下安装部署的方法一致。依旧推荐使用pip命令行进行安装。

使用IDE编写Python

在上述环境搭建好以后,我们便可使用Python来编写自动化脚本程序,执行Selenium自动化测试。在此之前,我们依旧需要解决一个问题,那就是IDE的选择。

IDE,Integrated Development Environment,集成开发环境。一个好的编辑器或者好的IDE将会极大的提高生产力,帮我们做很多事情,使得编码工作更加简单,编码的体验更加容易。一般情况下,我们有以下几种工具可以选择:

  • IDLE:Python自带的IDE,功能简单,使用方便
  • Notepad++:一个强大的开源编辑器
  • Vim:Linux系统中最好用的编辑器之一
  • Sublime Text:一个非常轻便好用的现代化的编辑器,推荐。
  • PyCharm:JetBrains公司提供的现代化的跨平台的Python IDE。

使用Sublime Text 3搭建Python环境

  1. **通过快捷键Ctrl + 或者View > Show Console打开控制台,输入以下代码并回车
import urllib.request,os; pf = 'Package Control.sublime-package'; 
ipp = sublime.installed_packages_path(); 
urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); 
open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())
  1. 安装完以后,重启Sublime Text 3
  2. 如果在Perferences->package settings中看到package control这一项,则安装成功
  3. 按下Ctrl+Shift+P调出命令面板
  4. 输入install package选项并回车
  5. 输入i,匹配到以后,按回车,安装。Anaconda是一个终极的Python插件。安装完了以后便可用Sublime Text 3编写Python代码,并且使用Ctrl + B来编译执行。

一般来说,一个好的IDE提供一下功能,使你的编码开发工作变得更有效率:

  1. 一个图形化的智能代码提示和补全功能
  2. 可以轻松查看方法和类
  3. 语法高亮
  4. 提供单元测试和调试的工具
  5. 源代码版本管理工具的支持

我们可以尝试用上述的编辑器或者IDE来进行Python代码编写工作。

开始使用WebDriver

接下来我们尝试几个简单的例子来体会一下Selenium WebDriver的使用。

示例1

## 引入WebDriver的包
from selenium import webdriver## 创建浏览器对象
browser = webdriver.Firefox()## 打开百度网站
browser.get('https://www.baidu.com/')

示例2

## 引入WebDriver包
from selenium import webdriver## 引入WebDriver Keys包
from selenium.webdriver.common.keys import Keys## 创建浏览器对象
browser = webdriver.Firefox()## 导航到百度主页
browser.get('https://www.baidu.com')## 检查标题是否为‘百度一下,你就知道’
assert '百度一下,你就知道' in browser.title## 找到名字为wd的元素,赋值给elem
elem = browser.find_element_by_name('wd')  # 找到搜索框
elem.send_keys('seleniumhq' + Keys.RETURN)  # 搜索seleniumhq## 关闭浏览器
browser.quit()

Selenium 3.0.1 出现的问题以及解决

3.0.1 更新以后,需要做两个操作:

  1. Geckodriver executable needs to be in PATH。Geckodirver的下载地址:https://github.com/mozilla/geckodriver/releases
    报错内容:
WebDriverException:Message:'geckodriver'executable needs to be in Path

geckodriver是一原生态的第三方浏览器,对于selenium3.x版本都会使用geckodriver来驱动firefox,所以需要下载geckodriver.exe。放置在Path 环境变量可以访问到的地方。例如 C:\python34
需要将火狐的安装路径放到path,然后重启(必须重启电脑)
报错内容:

selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.

参考地址:http://***.com/questions/40208051/selenium-using-python-geckodriver-executable-needs-to-be-in-path/40208762

XAMPP的安装部署和环境搭建

XAMPP的安装,在Windows操作系统中比较简单,可以直接运行安装文件,默认全部下一步,即可完成软件的安装。

请注意:Windows XP系统只能可以 XAMPP 1.8.2版本;Windows 7以及以上的系统可以安装最新版的XAMPP。XAMPP不分32位和64位操作系统。

XAMPP的部署

XAMPP = OS + Apache + MySQL + PHP + Perl

我们一般部署的网站,符合XAMPP环境的话,只需要启动Apache和MySQL两个应用。

部署步骤

  1. 启动Apache
  2. 启动MySQL
  3. 解压网站源文件,例如解压然之:ranzhi.2.5.zip,请把压缩包里面的ranzhi这个文件夹解压出来;禅道也类似,需要把压缩包中的zentaopms文件夹解压出来
  4. 部署源文件,请将解压以后的源文件放到xampp\htdocs文件夹中
  5. 通过浏览器访问部署好的网站源文件,进行向导安装。http://localhost/ranzhi/www
    PS:这里我们主要支持的是PHP+MySQL开发的网站部署。

XAMPP的问题解决

  • 无法启动Apache:请认真查看日志,判断80和443端口被什么样的程序占用,需要关闭对应程序,或者修改Apache的端口。

    1. IIS:控制面板 | 管理工具 | Internet信息服务 | 默认网站 | 关闭
    2. VisualSVN Server: 控制面板 | 管理工具 | VisualSVN Server | 关闭
    3. VMware Workstation: 开始 | VMware Workstation | 编辑 | 首选项 | 共享虚拟机 | 禁用共享
    4. HP LoadRunner: 右侧任务栏 | 右键 | 关闭
    5. 修改XAMPP Apache 端口:Config | httpd.conf修改Linsten 80 | Httpd-ssl.conf修改 Listen 443
  • 无法启动MySQL:请认真查看错误日志,找到已经启动的MySQL的程序进程,杀掉该进程。

使用unittest编写测试脚本

通过上面的例子,我们可以简单的写出Selenium WebDriver的脚本,但是对于测试工作来说,上述的脚本还远远不够。因为上述的脚本没有“检查”。

接下来我们将会使用Python语言的unittest框架展开“检查”。

unittest基础

unittest框架的原本的名字是PyUnit。是从JUnit这样一个被广泛使用的Java应用开发的单元测试框架创造而来。类似的框架还有NUnit(.Net开发的单元测试框架)等。

我们可以使用unittest框架为任意Python项目编写可理解的单元测试集合。现在这个unittest已经作为Python的标准库模块发布。我们安装完Python以后,便可以直接使用unittest。

unittest框架提供了编写test cases,test suites和test fixtures的基本功能。我们首先关注 Test cases的编写与执行。

使用unittest需要以下简单的三步:

  • 引入unittest模组
  • 继承unittest.TestCase基类
  • 测试方法以test开头

unittest示例

## 引入unittest模组
import unittest## 定义测试类,名字为DemoTests
## 该类必须继承unittest.TestCase基类
class DemoTests(unittest.TestCase):## 使用'@'修饰符,注明该方法是类的方法## setUpClass方法是在执行测试之前需要先调用的方法## 是开始测试前的初始化工作@classmethoddef setUpClass(cls):pass## 测试一(务必以test开头)def test_01(self):pass## 测试三(务必以test开头)def test_02(self):pass## 测试三(务必以test开头)def test_03(self):pass## tearDownClass方法是执行完所有测试后调用的方法## 是测试结束后的清除工作@classmethoddef tearDownClass(cls):pass# 执行测试主函数
if __name__ == '__main__':## 执行main全局方法,将会执行上述所有以test开头的测试方法unittest.main(verbosity=2)

Python知识的补充:

  1. Python文件的后缀名是.py
  2. .py文件可以用来直接执行。也可以被用来作为模块导入。在cmd命令行中执行的命令为python demo.py
  3. 在Python中导入模块(模组)一般使用的是import

使用unittest框架编写Selenium WebDriver测试

接下来我们查看一个完整的Selenium WebDriver自动化测试实例

实例

keyword">import unittest
keyword">from selenium keyword">import webdriver
keyword">from selenium.webdriver.common.keys keyword">import Keyskeyword">class SearchTests(unittest.TestCase):keyword">def setUp(self):# 创建一个新的浏览器对象self.driver = webdriver.Firefox()self.driver.implicitly_wait(30)self.driver.maximize_window()# 导航到京东主页self.driver.get("https://www.jd.com/")keyword">def test_search_by_category(self):# 获取到搜索框self.search_field = self.driver.find_element_by_id("key")self.search_field.clear()# 输入iphone 6s plus并按下回车进行搜索self.search_field.send_keys("iphone 6s plus"  + Keys.RETURN)# 获取所有的查询结果products = self.driver.find_elements_by_css_selector("li[class='gl-item']")# 断言:检查查询出来的个数是否为24个self.assertEqual(24, len(products))keyword">def tearDown(self):# 关闭浏览器对象self.driver.quit()keyword">if __name__ == '__main__':unittest.main(verbosity=2)

理解unittest框架提供的各种断言方法

在这里插入图片描述

定位符

元素的定位和操作是自动化测试的核心部分,其操作是建立在定位的基础上的。因此我们首选要开始定位元素。

在html里面,元素具有各种各样的属性。我们可以通过这样唯一区别其他元素的属性来定位到这个元素。WebDriver提供了一系列的元素定位方法。常见的有以下几种:

  • id
  • name
  • class name
  • tag
  • link text
  • partial link text
  • xpath
  • css selector

查找简单元素

我们从简单的一个元素开始定位。最基本的方法是id和name。大多数元素有这两个属性,在对控件的id和name命名是一般也会使其有意义,而取不同的名字。

例如我们看下面这段html

<input  />

我们可以使用对应的方法来定位这个input

find_element_by_id('search')
find_element_by_name('q')
find_element_by_class_name('input-text')

这里我们开始用最简单的方式来尝试定位

查看下面一个例子

self.driver.get('http://pro.demo.zentao.net')
# 用name定位用户文本输入框
self.account_field = self.driver.find_element_by_name('account')
# 用name定位密码文本输入框
self.password_field = self.driver.find_element_by_name('password')
self.account_field.clear()
self.password_field.clear()
self.driver.implicitly_wait(30)# 输入用户名demo
self.account_field.send_keys('demo')
# 输入密码123456
self.password_field.send_keys('123456')
self.driver.find_element_by_id('submit').click()
self.driver.implicitly_wait(30)companyname = self.driver.find_element_by_id('companyname')
self.assertEqual('demo项目管理系统', companyname.text)

示例2

self.driver.find_element_by_id('menuproduct').click()
self.driver.implicitly_wait(30)self.driver.find_element_by_id('menuproject').click()
self.driver.implicitly_wait(30)self.driver.find_element_by_id('menuqa').click()
self.driver.implicitly_wait(30)self.driver.find_element_by_id('menudoc').click()
self.driver.implicitly_wait(30)self.driver.find_element_by_id('menureport').click()
self.driver.implicitly_wait(30)self.driver.find_element_by_id('menucompany').click()
self.driver.implicitly_wait(30)self.driver.find_element_by_link_text('退出').click()
self.driver.implicitly_wait(30)

此外XPath定位和CSS Selector定位,和定位一组元素这样的内容案例,将在后续的讲义继续探讨和讲解。

控制浏览器

浏览器的控制也是自动化测试的一个基本组成部分,我们可以将浏览器最大化,设置浏览器的高度和宽度以及对浏览器进行导航操作等。

## 浏览器最大化
driver.maximize_window()## 设置浏览器的高度为800像素,宽度为480像素
driver.set_window_size(480, 800)## 浏览器后退
driver.back()## 浏览器前进
driver.forward()

这里我们做一个综合性的练习实例

# coding=utf-8
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
# import sys
# reload(sys)
# sys.setdefaultencoding('utf8')class WebDriverTests(unittest.TestCase):@classmethoddef setUpClass(cls):# create a new Firefox sessioncls.driver = webdriver.Firefox()cls.driver.get('about:blank')cls.driver.implicitly_wait(30)print(" -- set up finished -- ")print()def test_01_navigate(self):passurl_baidu = 'https://www.baidu.com/'url_zentao = 'http://pro.demo.zentao.net/user-login-Lw==.html'# 导航到百度self.driver.get(url_baidu)self.driver.maximize_window()self.driver.implicitly_wait(30)# 导航到禅道self.driver.get(url_zentao)self.driver.maximize_window()self.driver.implicitly_wait(30)# 后退self.driver.back()self.assertEqual(url_baidu, self.driver.current_url)self.driver.implicitly_wait(30)# 前进self.driver.forward()self.assertEqual(url_zentao, self.driver.current_url)self.driver.implicitly_wait(30)print("-- test 01 finished -- ")print()def test_02_element_interaction(self):self.driver.get('http://pro.demo.zentao.net')## 找到用户名和密码的输入框self.account_field = self.driver.find_element_by_name('account')self.password_field = self.driver.find_element_by_name('password')## 清除当前的输入self.account_field.clear()self.password_field.clear()self.driver.implicitly_wait(30)## 输入用户名和密码,进行登录self.account_field.send_keys('demo')self.password_field.send_keys('123456')self.driver.find_element_by_id('submit').click()self.driver.implicitly_wait(30)companyname = self.driver.find_element_by_id('companyname')self.assertEqual('demo项目管理系统', companyname.text)print(companyname.get_attribute('type'))print()self.driver.implicitly_wait(30)print('-- test 02 finished -- ')print()def test_03_element_interation2(self):## 这里执行了一段JavaScript代码js = 'selectTheme("green")'self.driver.execute_script(js)self.driver.implicitly_wait(30)js = 'selectTheme("red")'self.driver.execute_script(js)self.driver.implicitly_wait(30)js = 'selectTheme("lightblue")'self.driver.execute_script(js)self.driver.implicitly_wait(30)js = 'selectTheme("blackberry")'self.driver.execute_script(js)self.driver.implicitly_wait(30)self.driver.find_element_by_id('menuproduct').click()self.driver.implicitly_wait(30)self.driver.find_element_by_id('menuproject').click()self.driver.implicitly_wait(30)self.driver.find_element_by_id('menuqa').click()self.driver.implicitly_wait(30)self.driver.find_element_by_id('menudoc').click()self.driver.implicitly_wait(30)self.driver.find_element_by_id('menureport').click()self.driver.implicitly_wait(30)self.driver.find_element_by_id('menucompany').click()self.driver.implicitly_wait(30)self.driver.find_element_by_link_text('退出').click()self.driver.implicitly_wait(30)WebDriverWait(self.driver, 10).until(expected_conditions.element_to_be_clickable((By.ID, "submit")))self.driver.implicitly_wait(30)print('-- test 03 finished -- ')print()def test_04_cookies(self):self.driver.add_cookie({'name': 'key-neeeeew', 'value': 'value-neeeewwwww'})# 遍历cookies 中的name 和value 信息打印,当然还有上面添加的信息for cookie in self.driver.get_cookies():print("%s -> %s" % (cookie['name'], cookie['value']))print()self.driver.delete_all_cookies()cookies = self.driver.get_cookies()print(cookies)print()print('-- test 04 finished -- ')print()@classmethoddef tearDownClass(cls):# close the browser windowcls.driver.quit()passprint('-- tear down finished -- ')print()if __name__ == '__main__':unittest.main(verbosity=2)

最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

相关文章:

Selenium自动化测试Python二:WebDriver基础

欢迎阅读WebDriver基础讲义。本篇讲义将会重点介绍Selenium WebDriver的环境搭建和基本使用方法。 WebDriver环境搭建 Selenium WebDriver 又称为 Selenium2。 Selenium 1 WebDriver Selenium 2 WebDriver是主流Web应用自动化测试框架&#xff0c;具有清晰面向对象 API&…...

蓝桥杯模块学习17——AT24C02存储器(深夜学习——单片机)

一、硬件电路&#xff1a;1、引脚功能&#xff1a;&#xff08;1&#xff09;A0-A2&#xff1a;决定不同设备的地址码&#xff1a;&#xff08;2&#xff09;WP&#xff1a;写保护二、通讯方式&#xff08;IIC协议&#xff09;通讯方式与PCF8591相同&#xff0c;可参考以下文章…...

netty

Netty的介绍Netty是异步的&#xff08;指定回调处理&#xff09;、基于事件驱动的网络应用框架&#xff0c;用于快速开发高性能、高可靠性的网络IO程序。Netty本质是一个NIO框架&#xff0c;适用于服务器通讯相关的多种应用场景&#xff0c;分布式节点远程调用中Netty往往作为R…...

Django项目部署-uWSGI

Django项目部署-uWSGIDjango运维部署框架整体部署架构web服务器与web应用服务器的区别部署环境准备安装python3安装mariadb安装Django和相关模块Django托管服务器uWSGI使用uWSGI配置使用Django运维部署框架 整体部署架构 操作系统: Linux 。优势&#xff1a;生态系统丰富&…...

jhipster自动生成java代码的方法

一、前言 java springboot后台项目用到了jpa查询数据库&#xff0c;还用到了jhipster&#xff0c;这个东西可以自动生成基础的Controller、Service、Dao、JavaBean等相关代码&#xff0c;减少重复开发。 在此总结下使用方法。 二、jhipster自动生成java代码的方法 1.需要先…...

LeetCode 82. 删除排序链表中的重复元素 II

原题链接 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 给定一个已排序的链表的头 headheadhead &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,…...

tensorflow gpu环境安装

查看本电脑支持的最高cuda版本&#xff1a;nvidia-smi在~/.condarc修改conda 源&#xff1a;channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/- https://mirrors.tuna.tsinghua.edu.cn/…...

如何在现实场景中随心放置AR虚拟对象?

随着AR的发展和电子设备的普及&#xff0c;人们在生活中使用AR技术的门槛降低&#xff0c;比如对于不方便测量的物体使用AR测量&#xff0c;方便又准确&#xff1b;遇到陌生的路段使用AR导航&#xff0c;清楚又便捷&#xff1b;网购时拿不准的物品使用AR购物&#xff0c;体验更…...

操作系统-处理机调度

1.处理机调度的概念、层次1.1调度的基本概念制定某种规则来决定处理任务的顺序。1.2调度的三个层次高级调度&#xff08;作业调度&#xff09;中级调度&#xff08;内存调度&#xff09;进程的挂起态与七状态模型低级调度&#xff08;进程调度&#xff09;小结2.进程调度的时机…...

手机截图如何提取文字?

在当今信息爆炸的时代&#xff0c;图文并茂已经成为了一个广告宣传的常用方式。然而&#xff0c;图片中的文字信息往往难以获取&#xff0c;尤其对于那些需要快速获取信息的人们来说&#xff0c;阅读图片中的文字会是一项繁琐且费时的任务。现在&#xff0c;我们有一个好消息要…...

vue中复制内容

vue中复制内容vue2vue-clipboard2依赖项在main.js引入使用vue3vue-clipboard3依赖项引入使用更新于&#xff1a;2023-02-15vue2vue-clipboard2 依赖项 “vue”: “^2.6.11” “vue-clipboard2”: “^0.3.1” 在main.js引入 import VueClipboard from vue-clipboard2 Vue.us…...

MySQL CAST()函数用法

一、语法 expr&#xff1a;源数据&#xff0c;如字符串’China’。type&#xff1a;目标数据类型&#xff0c;例如CHAR。 cast(expr AS type)二、命令说明 将任何类型的值转换为具有指定类型的值。 CAST()函数通常用于返回具有指定类型的值&#xff0c;以便在WHERE&#xff…...

【测试工程师面试】详细记录 自己的一次面试

【测试工程师面试】详细记录 自己的一次面试 目录&#xff1a;导读 Linux基础 Oracle基础 编程基础 测试的基础 面试的问题 扯闲话部分&#xff1a; 10点刚到&#xff0c;先进行笔试&#xff0c;笔试的题目很基础&#xff0c;涉及到linux&#xff0c;涉及到oracle数据库…...

Elasticsearch 安装(二)

目录前言一、Linux 安装1、下载安装包⑴、选择需要的安装包⑵、下载解压到安装目录2、查看解压后目录结构3、启动 Elasticsearch⑴、正常启动流程⑵、启动过程遇到的问题①、启动报错②、创建运行 Elasticsearch 的用户&#xff0c;启动成功&#xff0c;但无法访问③、停止Elas…...

Java基础:异常与错误(ExceptionError)

1 缘起 某天上网冲浪时&#xff0c;偶然看到一个问题&#xff0c;说Java的Error和Exception有什么区别&#xff1f; 一句话&#xff1a;不知道。并不能很清晰地描述出个中区别。 当然&#xff0c;曾经也看过Throwable相关的知识&#xff0c;但是&#xff0c;并没有通过源码及注…...

VAmPI:一个包含了OWASP Top10漏洞的REST API安全学习平台

关于VAmPI VAmPI是一个包含了OWASP Top10漏洞的REST API安全学习平台&#xff0c;该平台基于Flask开发&#xff0c;该工具的主要目的是通过一个易受攻击的API来评估针对API安全检测工具的有效性&#xff0c;并帮助广大研究人员学习和了解API安全。 功能介绍 1、基于OWASP Top…...

springboot(6)之前端传递参数的方式 普通 集合 数组

实体类传递 首先我们在后端定义一个实体类&#xff0c;通过lombok插件重写 有参 无参 get set toString 方法, 然后前端发送数据&#xff0c;后端就会自动收到&#xff0c;然后属性填写 后端代码如下 AllArgsConstructor Data NoArgsConstructor public class role …...

redis分布式锁的演变过程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、直接添加Redis缓存二、使用setnx执行抢锁过程三、setnx获取锁+设置过期时间四、引入UUID解决误删锁问题五、引入Lua脚本来做删除六、对递归部分优化进行自旋七、添加自旋次数八、改为重入锁,使…...

leaflet 修改popup的样式,个性化弹窗(069)

第069个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中修改popup组件的样式,个性化弹窗。主要方法是更改css, 中增加custom-popup类名,style的样式要做穿透处理 >>>.具体方法请参考源代码。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实…...

注解ConfigurationProperties、EnableConfigurationProperties的用法

1 ConfigurationProperties ConfigurationProperties主要作用就是将prefix属性指定的前缀配置项的值绑定到这个JavaBean上 &#xff0c;通过指定的前缀&#xff0c;来绑定配置文件中的配置。这样的好处是将配置数据与JOPO进行转换&#xff0c;能够管理一个类别的所有配置信息&…...

自适应布局之淘宝无限适配+rem+微信rpx自适应

一、自适应布局 所谓前端适配&#xff0c;就是为了让移动设计稿在大部分的移动设备上看起来有一致的展示效果&#xff0c;目前比较流行的方法有两种。一种是强制meta viewport宽度为设计稿宽度&#xff0c;一种是使用rem自适应布局的flexible.js。 二、当前流行的移动端自适应…...

esxi不能识别不兼容网卡解决方案

相信很多网友在安装测试VMWARE Esxi 6.0的时候&#xff0c;总会遇到无法兼容网卡的情况&#xff0c;本人也是遇到了再组装的台式机上测试ESXI 6.0的时候&#xff0c;无法识别REALTEK RTL 8111E的情况。 找了很多网友提供的博客&#xff0c;方法是正确的&#xff0c;但是不够严…...

Sizeof与Strlen的区别与联系

16年写了很多 C 与 C 相关的文章&#xff0c;但是后面从事了 Android 开发&#xff0c;就全部删掉了&#xff0c;无意中发现了这篇由还存在草稿箱&#xff0c;索性就找回来吧&#xff0c;也是追忆当年学习的青葱岁月 Sizeof与Strlen的区别与联系 一、sizeof sizeof(…)是运算…...

力扣(LeetCode)413. 等差数列划分(2023.02.15)

如果一个数列 至少有三个元素 &#xff0c;并且任意两个相邻元素之差相同&#xff0c;则称该数列为等差数列。 例如&#xff0c;[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums &#xff0c;返回数组 nums 中所有为等差数组的 子数组 个数。 …...

蓝桥杯刷题——基础篇(一)

这部分题目&#xff0c;主要面向有志参加ACM与蓝桥杯竞赛的同学而准备的&#xff0c;蓝桥杯与ACM考察内容甚至评测标准基本都一样&#xff0c;因此本训练计划提供完整的刷题顺序&#xff0c;循序渐进&#xff0c;提高代码量&#xff0c;巩固基础。因竞赛支持C语言、C、Java甚至…...

Java基础知识快速盘点(三)

一&#xff0c;构造器 创建一个类的方法时会调用该类的构造器 构造器&#xff0c;也叫构造方法 构造器是属于类的&#xff0c;对象不可调用 构造方法没有返回值类型 构造方法一般用public修饰&#xff0c;也可用private修饰&#xff0c;例如 public class Test {private T…...

vscode编程小插件之Doxygen和Better Align

一、插件Doxygen:配置相应文件、函数说明项。 1、扩展商店&#xff0c;搜索Doxygen&#xff0c;如下图1&#xff0c;安装。 图1 2、设置项中&#xff0c;选择扩展设置&#xff0c;如图2 图2 3、配置版本、作者邮箱、作者名称、日期格式等等&#xff0c;如图3 4、定义函数后&…...

指 针

1.指针指针的作用: 可以通过指针间接访问内存&#xff08;可以通过指针的保存一个地址&#xff08;指针--地址&#xff09;&#xff09;内存编号是从0开始记录的&#xff0c;一般用十六进制数字表示。可以利用指针变量保存地址指针变量的定义和使用指针变是定义语法: 数据类型 …...

安卓小游戏:俄罗斯方块

安卓小游戏&#xff1a;俄罗斯方块 前言 最近用安卓自定义view写了下飞机大战、贪吃蛇、小板弹球三个游戏&#xff0c;还是比较简单的&#xff0c;这几天又把俄罗斯方块还原了一下&#xff0c;写了一天&#xff0c;又摸鱼调试了两天&#xff0c;逻辑不是很难&#xff0c;但是…...

NC113 验证IP地址

验证IP地址_牛客题霸_牛客网 描述 编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址 IPv4 地址由十进制数和点来表示&#xff0c;每个地址包含4个十进制数&#xff0c;其范围为 0 - 255&#xff0c; 用(".")分割。比如&#xff0c;172.16.254.1&#…...

商城移动端网站开发/东莞网站推广大全

引子 今年开始&#xff0c;我在翻译一本大部头的&#xff0c;比较经典的的Python进阶书籍。 有空就翻译几页。这本书不仅是教你很多进阶的Python的语法&#xff0c;更重要的是讲解很多设计方法和设计思想。 这些方法和思想&#xff0c;一点点叠加起来&#xff0c;就会让你从…...

网站建设绩效考核方案ppt/电脑培训班附近有吗

我很想知道westwood算法的深意&#xff0c;不仅仅是算法本身&#xff0c;还包括它的名字。 是的&#xff0c;为什么叫westwood&#xff1f;有朋友告诉我这是一个地名&#xff0c;并建议我去美国西海岸转一圈&#xff0c;然后我就发现IT圈子里不明所以看起来高大上的名字都是地…...

刚刚邯郸发生大事了/seo公司排名

方案一&#xff1a;使用360急救箱扫描打开 360安全卫士&#xff0c;在主界面右侧点击“功能大全(更多)”&#xff0c;找到并打开“系统急救箱”。等360系统急救箱安装并更新完成后&#xff0c;点击右侧的“系统设置修复区”点击“全选”按钮后&#xff0c;点击“扫描修复”按钮…...

高端网站设计收费/谷歌优化师

数字化时代客户体验管理与卓越厅堂服务课程背景&#xff1a; 数字化浪潮下&#xff0c;很多网点存在以下问题&#xff1a;不清楚如何提升网点数字化客户体验&#xff1f;不清楚网点数字化客户体验应用案例&#xff1f;不积善成德如何打造网点卓越厅堂服务&#xff1f; 课…...

上海建设银行网站静安支行/站长域名查询工具

为什么80%的码农都做不了架构师&#xff1f;>>> RT 转载于:https://my.oschina.net/230/blog/143545...

可以做公司宣传的网站有哪些/互联网营销师证书含金量

Log4J是Apache的一个开放源代码项目(http://logging.apache.org/log4j/docs/)&#xff0c;它是一个日志操作包。通过使用Log4J,可以指定日志信息输出的目的地&#xff0c;控制每一条日志的输出格式&#xff0c;定义日志信息的级别。所有这些功能通过一个配置文件灵活进行配置。…...