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

news2024/10/1 17:21:36

欢迎阅读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方法是在执行测试之前需要先调用的方法
    ## 是开始测试前的初始化工作
    @classmethod
    def setUpClass(cls):
        pass

    ## 测试一(务必以test开头)
    def test_01(self):
        pass

    ## 测试三(务必以test开头)
    def test_02(self):
        pass

    ## 测试三(务必以test开头)
    def test_03(self):
        pass

    ## tearDownClass方法是执行完所有测试后调用的方法
    ## 是测试结束后的清除工作
    @classmethod
    def 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 Keys

keyword">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):

    @classmethod
    def setUpClass(cls):
        # create a new Firefox session
        cls.driver = webdriver.Firefox()
        cls.driver.get('about:blank')
        cls.driver.implicitly_wait(30)
        print(" -- set up finished -- ")
        print()

    def test_01_navigate(self):
        pass
        url_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()

    @classmethod
    def tearDownClass(cls):
        # close the browser window
        cls.driver.quit()
        pass
        print('-- tear down finished -- ')
        print()

if __name__ == '__main__':
    unittest.main(verbosity=2)

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP ABAP 输出结果带有空格

方法一&#xff1a; 字段内容前增加空格&#xff0c;需使用全角空格&#xff0c;使用半角空格时&#xff0c;ALV显示无效&#xff0c;空格无法显示&#xff0c; 全角与半角的切换方法&#xff1a;shift空格切换&#xff0c; 如下的标记部分&#xff0c;要想通过ALV显示空格&…

mfc140u.dll丢失的解决方法,mfc140u.dll文件修复

mfc140u.dll丢失的解决方法&#xff0c;其实要解决这个问题一点都不难&#xff0c;我们主要知道是什么原因造成的&#xff0c;那么就可以轻松的解决。 一.mfc140u.dll是什么 "MFC140u.dll"是一个Windows动态链接库文件&#xff0c;它是Microsoft Visual C 2015运行…

TortoiseSVN的使用

基本概念 版本库 SVN保持数据的地方&#xff0c;所有的文件都保存在这个库中&#xff0c;Tortoise访问的就是远程服务器上的Subversion版本库。 工作拷贝 就是工作副本&#xff0c;可将版本库的文件拷贝到本地中&#xff0c;可以任意修改&#xff0c; 不会影响版本库。在你…

责任链模式(Chain of Responsibility Pattern)

意图&#xff1a;避免请求发送者与接收者耦合在一起&#xff0c;让多个对象都有可能接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止。 主要解决&#xff1a;职责链上的处理者负责处理请求&#xff0c;客户只…

常用调试golang的bug以及性能问题的实践方法

文章目录如何分析程序运行时间和CPU利用率情况1.shell内置time指令/usr/bin/time指令如何分析golang程序的内存使用情况&#xff1f;1.内存占用情况查看如何分析golang程序的CPU性能情况1.性能分析注意事项2.CPU性能分析A.Web界面查看B.使用pprof工具查看如何分析程序运行时间和…

PHP(12)文件上传

PHP&#xff08;12&#xff09;文件上传一、文件上传原理二、表单写法三、预定义变量 $_FILES四、移动临时文件五、多文件上传1. 同名表单2. 不同名表单六、多文件处理1. 同名文件2. 不同名文件七、封装文件上传函数一、文件上传原理 文件从客户机上传至服务器指定目录。 步骤…

Redhat7.6升级openssh(超详细)

一、准备工作 从官网下载新版的openssh-7.9p1.tar.gz 准备rhel-server-7.6-x86_64-dvd.iso用于使用yum安装依赖 二、具体升级步骤 1.查看系统版本 [rootredhat ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.6 (Maipo) 2.查看openssh现有版本 …

金三银四面试必看,自动化测试如何解决日志问题

前言 前几天在员群里&#xff0c;有同学问了一个自动化测试实践中遇到的问题&#xff1a; 持续集成的自动化用例很多&#xff0c;测试环境日志level为debug&#xff0c;日志量大概40G/每天&#xff0c;定位问题时日志查询很慢&#xff0c;该怎么解决&#xff1f; 这个问题可…

pytorch基础入门教程

pytorch基础入门教程 Pytorch一小时入门教程 前言 机器学习的门槛并没有想象中那么高&#xff0c;我会陆续把我在学习过程中看过的一些文章和写过的代码以博客的形式分享给大家&#xff0c;和大家一起交流&#xff0c;这个是本系列的第一篇&#xff0c;pytoch入门教程&#x…

软件测试2-测试必须有策略和测试有哪些最高原则

什么是软件测试测试是为发现错误而执行程序的过程。软件测试一个破坏性的过程&#xff0c;甚至是一个施虐的过程&#xff0c;也就是第一天说的“找茬”游戏。 当一个输入框让我输入手机号码时&#xff0c;我偏不&#xff0c;我要输入非手机号码&#xff0c;甚至不填。 当界面提…

定时任务使用总结

定时任务表达式生成工具网站&#xff1a;https://cron.qqe2.com/定时任务选型&#xff1a;xxl-job 官方文档&#xff1a;https://www.xuxueli.com/xxl-job/安装定时任务调度中心 xxl-job-admin第一步、先导入xxl-job的数据库&#xff1a;地址&#xff1a;https://gitee.com/xux…

2.2 多区域集成IS-IS

2.2.2 实验二:多区域集成IS-IS 1. 实验目的  实现IS-IS协议DIS优先级修改 实现IS-IS协议网络类型修改 实现IS-IS协议外部路由引入 实现IS-IS接口cost修改 实现IS-IS路由渗透配置2. 实验拓扑 配置多区域集成IS-IS如图2-5所示: …

Java 万年历、周六日计算、节假日导出

目录 通过 Java 的基本语法来实现万年历 Java 获取一年中所有的周六和周日 Java 节假日导入导出 通过 Java 的基本语法来实现万年历 在 Java 的时间计算方面还有很多好用的工具类&#xff0c;Java 常用的工具类封装框架链接如下&#xff1a;HUTool 框架官网 package com.ta…

企业降本增效的催化剂:敏捷迭代

伴随着开源技术的大爆发&#xff0c;新一代的软件技术如雨后春笋般层出不穷。每家企业在硬件及软件开发上都有许多开源技术可选&#xff0c;目的还是在于提高效率&#xff0c;降低开发成本。 本篇文章&#xff0c;带大家了解下促进企业降本增效的重要理念&#xff1a;敏捷迭代…

前端错误/性能监控(vue)

配置目录结构 错误监听&#xff1a;可以提前发现前端的错误&#xff0c;并且找到对应的位置进行修改。因为等等环境因素可能导致不同的问题&#xff0c;这些问题难以发现&#xff0c;影响用户体验。 性能监听&#xff1a;可以及时发现问题&#xff0c;比如下载的js文件、image时…

Stream流源码分析及技巧(含大量案例)

Stream流源码分析及技巧&#xff08;含大量案例&#xff09; 目录 Stream流源码分析及技巧&#xff08;含大量案例&#xff09; 更新说明 简介&#xff08;这部分摘了部分官方文档&#xff09; 特性 Stream接口关系图 Stream流接口方法 Stream流之间的转换 与Stream流相…

华为OD面试经验分享,尤其注意机试题部分

文章目录招聘流程和背景介绍面试准备机试题目类型和解答技巧在算法部分在操作系统部分面试官提问和答题技巧面试总结和建议推荐一些华为 od 常见的机试题题目&#xff1a;两数之和题目&#xff1a;二叉树的遍历题目&#xff1a;链表反转题目&#xff1a;最大子序和招聘流程和背…

解决QML debugging is enabled.Only use this in a safe environment.警告

系列文章目录 文章目录系列文章目录前言一、警告原因二、解决办法参考前言 我试图运行一个非常简单的程序&#xff0c;当单击退出按钮时关闭窗口&#xff0c;但获取以下输出&#xff0c;前提是包含按钮的应用程序窗口不显示&#xff1a; 您已启用QML调试(实际上它默认启用)&…

CleanMyMac4.12.5最新版Mac系统清理优化工具

CleanMyMac X可以优化Mac系统。mac系统用久了&#xff0c;用CleanMyMac清理一下效果还不错。可用来清理系统的缓存、日志、语言和垃圾文件&#xff0c;还能卸载应用程序。小编给您带来cleanmymac中文版&#xff0c;CleanMyMac是一款Mac系统清理优化工具&#xff0c;使用只需两个…

Java中Synchronized关键字的基本使用方法

Java中Synchronized关键字的基本使用方法 1.简介 Synchronized是java的关键字&#xff0c;synchronized可以保证在同一个时刻&#xff0c;只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作)&#xff0c;synchronized可保证一个线程的变…