WPF UIAutomation测试套件开发

article/2025/10/15 4:17:48

目录

介绍

目标

测试方案

功能测试(黑匣子)

测试示例

设计

记录测试并生成测试方法

更新测试方法并构建

测试用例规范

测试方法

初始化方法

实现自定义TestContext

测试配置

关于CodedUI的常见问题

不要手动更改* .Designer.cs文件中的代码

经常的异常

NullReferenceException

无法找到UI控件

结论

参考文献


  • 下载AvalonEdit_05_03.CodedUITest.zip
  • 下载AvalonEdit_05_03.zip

介绍

可以通过编码准则和自动测试来确定软件的质量。通常会有单元测试以确保小型单元(例如methods)的质量符合预期。在足够大的项目中,还有其他自动化测试,例如用户界面(UI)测试,以确保用户体验符合预期。

本文是关于用户界面(UI)测试的自动化测试。我们使用Microsoft最新的测试环境CodedUI作为示例来说明如何将测试自动化集成到软件开发迭代中。我们在本文撰写期间发现CodedUI将在Visual Studio 2019结束时被弃用,尽管距离2019年文章的发布日期尚有一段距离,但也有必要指出许多讨论的原则这里也可以应用于其他UI测试框架。

HTMLUI测试自动化已经存在了一段时间。尽管像Selenium这样的开放源代码测试环境已成为最新技术,但还有其他开放源代码项目(如Appium可用于测试WPF应用程序。

本文列出了开发任何自动UI测试时应实现的重要实践。我们解释了CodeUI测试框架的基本功能和用例,并以此来说明可以扩展方法和属性,从而可以自动化地对测试目标的先前不可测试的部分进行测试。

使用MicrosoftCodedUI的重要先决条件是您已安装Visual Studio Enterprise

目标

UI测试自动化与常规软件开发有很多相似之处,但也具有独特的属性,使其与其他类型的开发区分开。我们使用本节来讨论在实际项目中使用UI自动化时应遵循的最佳实践。应该遵守以下高层目标,以确保尽管UI测试自动化付出了额外的努力,仍可以正常进行开发:

  • WPF应用的早期迭代中引入自动化测试,
  • 保持测试代码易于编写和维护,
  • 使测试套件易于部署和运行。

以上几点可以通过自动化测试的重要原理进行扩展。这些原则确保您不仅可以测试任何东西,还可以从项目中最重要的地方开始,并且可以按照自己的方式处理不太重要的事情。这些原则是:

  • 从在外部接口上进行测试开始,
  • 保持每种测试方法的测试目标简单明了(在测试方法中混合太多逻辑不是一个好主意),
  • 请勿修改测试对象或测试环境,
  • 减少重复测试
    • 无法测试所有组合,
    • 选择最有用的组合,
    • 避免多余的测试范围,
  • 在开发进度与测试进度之间取得平衡。

某些问题(如上述最后一点)解决了重要问题,例如可维护性和自动化UI测试的额外工作。不难看出,具有简单用户界面的简单项目几乎无法证明为进行测试自动化所做的任何额外努力。但是,也有一些项目由大型(去中心化)软件开发人员团队生产,供数百或数千名客户使用。尽管需要付出额外的努力,但这些项目仍可以从测试自动化中获利,因为通过自动化进行的常规测试可以确保UI的所有部分在进入开发周期的最后阶段(修复错误)之前都可以通过基本测试。

测试方案

在软件开发过程中可以执行多种测试。这些是:

  • 单元测试
  • 集成测试
  • 功能测试
  • 验收测试,
  • 性能测试,
  • 以及更多[1]

我们在以下各节中详细介绍了功能测试及其自动化,以说明如何通过代码测试用户界面(UI)。功能测试的开发与软件开发本身具有相似之处,因为我们可以应用最佳实践,模式和经验教训。一种显而易见的最佳实践是应用至少涉及两个原理的高级设计原理,并且适用于每种测试:

  1. 从软件要求开始。全面确定测试要求至关重要,因为这将直接影响测试范围。
     
  2. 对于每个测试要求,请始终使用:
    1. 等价类划分 [2]
    2. 边值分析 [3],以及
    3. 推论错误

全面制作测试用例。

全面的测试案例是从用户需求开始的案例,因为它可以确保用户的可能行为反映在所需的质量中。这可以通过使用列出的模式并花一些时间来推断到目前为止可能尚未评估的错误来确保。

功能测试(黑匣子)

功能测试是一种软件测试,可根据规范中的功能要求对软件进行测试。功能测试也称为黑盒测试,因为该测试将被测试的系统视为无法打开以查看其内部的盒子。这种类型的测试主要围绕对系统输入,系统输出和测试期间的行为的期望,而不是查看系统的内部细节。基于故事的功能需求如下所示:

  1. 用户启动系统,
  2. 用户更改程序设置,
  3. 用户单击关闭(按钮),
  4. 系统保存所有更改的程序设置,并
  5. 系统停止运行

对此要求的测试将是确定该软件确实保存了所有相关数据并正确关闭了该软件。可以由测试工程师手动执行此测试,但是与手动方法相比,自动化具有许多优势。本节说明如何使用UI Automation for WPF设计和执行自动化功能测试。

此过程通常涉及以下步骤:

步骤

描述

设计

  1. 确定先决条件
  2. 确定该软件应执行的功能,以及
  3. 确定结果。

生成测试方法

使用Microsoft UIAutomation API或以下方式模拟用户操作:

  1. 模拟用户操作并使用Visual Studio编码的UI工具记录它们。
  2. 从录制后生成测试代码,并对其进行手动修改以使其更具扩展性。例如,更新方法参数以使其支持数据驱动的测试。

编译并执行

执行测试方法。

检查测试结果

比较实际和预期输出。

Microsoft UI自动化是用于Microsoft Windows的新的可访问性框架。它通过提供对有关用户界面(UI[4]信息的编程访问来满足辅助技术产品和自动测试框架的需求。

Visual Studio编码的UI [5]封装了UI自动化API,并提供了一个工具(CodedUITestBuilder.exe)来记录用户操作并自动生成测试代码。请注意,Visual Studio编码的UI需要使用Visual Studio Enterprise和编码的UI测试组件进行记录。

在下面的下一部分中,我们将使用上述工具详细介绍自动化功能测试。

测试示例

该测试的测试目标通常是一个技术单元:控制,库,或整个软件产品。本节中的测试目标是开源控件AvalonEdit(版本5.0.3)(Github上的源代码),我们设计了一个测试用例以验证其字体设置功能。

设计

我们的示例测试用例设计如下:

  1. 启动AvalonEdit.Sample应用程序,
  2. 将字体大小设置为指定的有效值(例如:16),
  3. 验证文本字体大小是否与上一步中设置的相同。

值得注意的是,上述测试用例设计与功能测试部分中确定的工作流程非常相似。这种相似性支持这样的想法,即用户应该由驱动测试目标的软件组件模拟,并且使通常的做法既可以直接实现功能测试用例(作为自动测试),也可以实现给定功能测试的足够接近的变体。

记录测试并生成测试方法

在我们的例子中,驱动测试目标的测试组件是CodedUI测试框架。使用CodedUI进行测试记录需要单独的设置和项目类型[5] [6]

测试步骤的记录和测试方法的生成(使用CodedUITestBuilder.exe)可以通过CodedUI Test Builder接口完成:[5]

可以在CodedUI测试项目中使用上述用户界面来记录并生成实现上述测试用例[5]测试代码,首先单击记录/暂停/继续按钮,然后执行步骤23,并通过单击生成代码按钮生成测试代码,然后代码应如下所示(最好稍后改进SetFontSize方法以将字体大小作为输入参数):

CodedUITest

[TestMethod]
public void CodedUITestMethod1()
{// To generate code for this test, select "Generate Code for CodedUI Test" from the shortcut menu and select one of the menu items.this.UIMap.SetFontSize();
}

UIMap

/// <summary>
/// SetFontSize - Use 'SetFontSizeParams' to pass parameters into this method.
/// </summary>
public void SetFontSize()
{WinEdit uIFontEdit = this.UIAvalonEditSampleWindow.UIItemToolBar.UITxtFontEdit;WinEdit uIFontSizeEdit = this.UIAvalonEditSampleWindow.UIItemToolBar.UITxtFontSizeEdit;// Type '16' in 'FontSize' text boxuIFontSizeEdit.Text = this.SetFontSizeParams.UIFontSizeEditText;// Click 'Font' text boxMouse.Click(uIFontEdit);
}

UIMap文件是支持测试项目中的UI元素和操作的核心文件。测试项目包含至少3种类型的文件:*.uitest*.cs,和*.designer.cs*.uitest是一个XML文件。这两个*.uitest*.designer.cs文件会自动生成(他们不应该手动更改,因为更改将在下次记录操作后会丢失)。因此,要添加自定义代码,应双击该*.uitest文件,然后单击移动按钮(在下图中标记为黄色)。

点击移动按钮后,RecordedMethod1位于示例UIMap.cs文件中。我们可以将方法重命名为SetFontSize并添加参数。不用担心,现在CodedUI Test Builder工具不会自动更改代码。请参阅本文后面的常见问题解答部分,以获得更多类似的提示。

然后,当我们记录了初始测试步骤后,就该验证结果了。为此,只需将添加断言按钮拖到编辑器区域(编辑器区域将自动标记为蓝色,如下所示),即可添加一个断言方法,以验证AvalonEdit中的文本字体是否已按预期更改。

可能的断言列表显示在添加断言工具窗口中。字体大小属性在这里丢失。似乎我们无法通过CodedUI测试生成器获取字体大小,因为AvalonEdit不会公开UIAutomationfont属性。检查AvalonEdit源代码,使我们发现它实现了ITextRangeProvider接口,但在GetAttributeValue方法中对我们没有任何帮助:

public object GetAttributeValue(int attribute)
{Log("{0}.GetAttributeValue({1})", ID, attribute);return null;
}

因此,为了使验证步骤可测试,我们可以改进GetAttributeValue方法以暴露font属性,或者在无法更改源代码的情况下,我们可以实现一个从要测试的控件继承的子类(这里要分的类是TextEditor类)。

应该重写OnCreateAutomationPeer方法以返回自定义AutomationPeer子类,该子类实现相关的模式提供程序以暴露相关的属性。有关在桌面上以编程方式访问UI元素的更多信息,请参考UIAutomation基础知识[4]

在此示例中,可以按如下所示改进GetAttributeValue方法(请参见GitHub上文章或源代码附带的下载示例:ICSharpCode.AvalonEdit \ Editing \ TextRangeProvider.cs):

public object GetAttributeValue(int attribute)
{if (AutomationTextAttribute.LookupById(attribute) == TextPatternIdentifiers.FontSizeAttribute){return this.textArea.FontSize;}else{if (AutomationTextAttribute.LookupById(attribute) == TextPatternIdentifiers.FontNameAttribute)return this.textArea.FontFamily.Source;elsereturn null;}
}

现在,我们准备重建AvalonEdit.Sample,再次拖动assert按钮,我们将发现该Font属性获得了当前文本的字体名称值。仍然没有FontSize属性。微软提供了一种创建可支持特定用户界面的CodedUI测试框架自定义扩展的方法[7]。但这很难调试,更糟糕的是,Microsoft不赞成这样做。因此,此处不建议使用此解决方案。

实际上,使用UIAutomation可以直接访问FontSize属性。返回到CodedUI测试项目中的FontSize示例,并手动添加以下验证方法以实现FontSize属性声明:

public void SetFontSize(double fontSize)
{this.UIAvalonEditSampleWindow.UIItemToolBar.UITxtFontSizeEdit.Text = fontSize.ToString();Mouse.Click(this.UIAvalonEditSampleWindow.UIItemToolBar.UITxtFontEdit);
}public void AssertMethod1(double expectedFontSize)
{WpfControl uiTestControl = this.UIAvalonEditSampleWindow.UITextEditorDocument.UIItemDocument;AutomationElement automationElement = uiTestControl.NativeElement as AutomationElement;if (automationElement.TryGetCurrentPattern(TextPattern.Pattern, out object pattern)){object obj = ((TextPattern)pattern).DocumentRange.GetAttributeValue(TextPattern.FontSizeAttribute);double actualFontSize = Convert.ToDouble(obj);Assert.AreEqual(expectedFontSize, actualFontSize, "Font size verified.");}Assert.Fail("Assert fail message.");
}

当满足所有前提条件时,SetFontSize方法可用于更改测试目标的字体大小。在另一方面AssertMethod1验证给定的字体大小当前是否设置与否,并在如果不是的情况下抛出Assertion failed。可以在下一部分中看到的相似模式可以用于在测试方法中实现FontSize get / set方法。

更新测试方法并构建

测试用户交互和验证正确的结果可以通过两种单独的方法来实现。然后,可以使用以下代码来实现完整的测试方法:

[TestMethod]
public void SetFontSizeTest()
{double expectedFontSize = 16;this.UIMap.SetFontSize(expectedFontSize);this.TestContext.WriteLine($"Step 1: set the font size to {expectedFontSize.ToString()}.");double actualFontSize = this.UIMap.GetFontSize();this.TestContext.WriteLine($"Step 2: get the current font size of the TextEditor: {actualFontSize}.");Assert.AreEqual(expectedFontSize, actualFontSize, "");this.TestContext.WriteLine("Step 3: confirm the current font size of the TextEditor is same as set in step 1.");
}

现在,我们可以使用Visual Studio测试平台(通过IDE)或通过命令行来构建和运行测试方法,并且测试应该成功执行。可以在Visual Studio中查看测试结果:

测试用例规范

测试方法

带有TestMethod属性标记的方法可以自动识别为测试用例。可能还有其他与测试方法有关的实例或方法。这些可能是初始化或建立在执行期间使用TestContext的前提条件所必需的。本节说明了初始化方法,并给出了实现自定义TestContext的示例。

初始化方法

初始化方法可以在不同的执行级别上实现。当前,按照自上而下的粒度顺序,下面列出了4种初始化方法:

  • AssemblyInitialize:在所有测试方法之前,在与测试方法相同的程序集中仅执行一次,
     
  • ClassInitialize:在所有测试方法之前,在与测试方法相同的类中仅执行一次,
     
  • Constructor:每次在执行测试方法之前执行一次(如果测试方法是实例方法,则首先创建一个新实例)
     
  • TestInitialize:每次在执行测试方法之前执行。

每个初始化方法都有一个清除方法(一种Dispose方法可以视为构造函数的清除方法),并以相反的顺序执行。

实现自定义TestContext

以下是一个示例,展示了一种实现和使用自定义TestContext来替换默认值的方法。

public class CustomTestContext : TestContext
{private TestContext testContext;public CustomTestContext(TestContext testContext) { this.testContext = testContext; }public override void WriteLine(string format, params object[] args){// Perform custom behavior such as re-direct write stream.}public override DataRow DataRow => this.testContext.DataRow;
}

下一个代码示例显示了如何在测试中使用TestContext实例。测试类实现的属性类型为'TestContext',名称为'TestContext',因此名称和类型均不能更改,因为属性设置器会在实际测试执行之前通过MSTest Framework自动执行。

[TestClass]
public class Test
{[TestMethod]public void TestMethod1(){}private CustomTestContext testContext;public TestContext TestContext{get{return this.testContext;}set{this.testContext = new CustomTestContext(value);}}
}

任何测试都可能受到许多全局变量的影响,我们已经在这里看到了如何在测试中使用TestContext。下一节简要介绍了测试配置文件,这些文件也应该影响全局级别的测试。

测试配置

Visual Studio测试平台中有两种类型的配置文件:

  1. .runsettings 
  2. .testsettings

.runsettings文件用于配置单元测试[8].testsettings文件由早于VS 2019Visual Studio版本使用。可以引用旧的.testsettings文件,并与.runsettings文件一起使用,如下所示:

<RunSettings><MSTest> <SettingsFile>my.testsettings</SettingsFile><ForcedLegacyMode>true</ForcedLegacyMode></MSTest>
</RunSettings>

关于CodedUI的常见问题

不要手动更改* .Designer.cs文件中的代码

CodedUI测试生成器生成了3个文件。这些文件的扩展名是:

  1. * .uitest
  2. * .cs
  3. * .Designer.cs

每次录制后,*.Designer.cs文件都会更新。因此,您不应更改它,因为Visual Studio仍然可能会覆盖您的更改。自定义方法应始终移至* .cs文件。您可以通过双击* .uitest文件并单击以下屏幕快照中所示的移动按钮来执行此操作:

经常的异常

2个异常(NullReferenceException无法找到UI控件)通常是由线程问题引起的。本节将说明问题并提出解决方案。

NullReferenceException

CodedUI测试以COM(公共对象模型)的单线程单元(STA)模式运行。在这种模式下,应仅从TestMethod线程调用所有回放调用,并且UITestControl不应在TestMethods之间共享。

例如,AssemblyInitializeClassInitialize方法是在不同的线程中使用TestMethod执行的静态方法。因此,需要在调用任何UIMap方法之前手动初始化回访环境并创建不同的UIMap实例。通常可以使用以下try模式完成此操作:

[ClassInitialize]
public static void MyClassInitialize() 
{     Playback.Initialize();     try     {         UIMap uiMap = new UIMap();uiMap.DoSomethin(); }     finally     {         Playback.Cleanup();    } 
}

无法找到UI控件

此问题的详细错误消息是:搜索可能在'XXControl'上失败了

此错误可能是由于CodedUI测试生成器中的错误未记录目标控件的正确祖先而引起的。

自定义控件可能具有虚拟化的子级。如果要搜索的控件是“ XXControl”自定义的后代,则将其作为父容器包含可能会解决此问题。

例如,如果有一个名为A的控件,该控件的子级为B,而B的子级为C。并且CodedUI测试生成器未能检测到正确的树结构并将A确定为C的容器。那么您需要更新手动修复该问题的结构,如下面的代码片段所示:

uiMap.A.C.Container = uiMap.B;uiMap.B.Container = uiMap.A;

结论

本文试图向读者介绍自动化UI测试的领域。我们建议使用从学习到的教训到将UI测试集成到现有开发周期中的模式,而不是黑魔法。我们还展示了如何通过自原始测试目标派生的自定义测试类来使似乎无法用UI测试测试的属性可测试。

参考文献

  1. 不同类型的测试
    https://www.atlassian.com/continuous-delivery/software-testing/types-of-software-testing
     
  2. 等效类划分
    https://en.wikipedia.org/wiki/Equivalence_partitioning
     
  3. 边界值分析
    https://en.wikipedia.org/wiki/Boundary-value_analysis
     
  4. Microsoft UI自动化
    https://docs.microsoft.com/zh-cn/windows/desktop/WinAuto/entry-uiauto-win32
     
  5. 使用CodedUI测试来测试您的代码
    https://docs.microsoft.com/zh-cn/visualstudio/test/use-ui-automation-to-test-your-code?view=vs-2019
     
  6. UIAutomation基础知识
    https://docs.microsoft.com/zh-cn/windows/desktop/WinAuto/entry-uiauto-win32
     
  7. 第三方控件的CodedUI测试扩展
    https://devblogs.microsoft.com/devops/coded-ui-test-extension-for-3rd-party-controls-the-basics-explained/
     
  8. 使用.runsettings文件配置单元测试
    https://docs.microsoft.com/zh-cn/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-201

http://chatgpt.dhexx.cn/article/trIPPv3G.shtml

相关文章

安卓手机 Python 自动化( uiautomation、uiautomation2、weditor )

其他自动化工具或者框架&#xff1a; Airtest&#xff1a;https://airtest.readthedocs.io/zh_CN/latest/autojs&#xff1a;Auto.js快速入门实战教程&#xff1a;https://zhuanlan.zhihu.com/p/90065914appium&#xff1a;https://blog.csdn.net/freeking101/article/details/…

UIAutomation识别UI元素

MS UI Automation(Microsoft User Interface Automation&#xff1a;UIA)是随.net framework3.0一起发布的&#xff0c;虽然在如今这个几乎每天都有各种新名词、新技术出来的所谓的21世纪&#xff0c;它显得已经有些过时了。前些日子&#xff0c;正好一个项目&#xff0c;可以用…

uiautomation实现自动化

1.下载UI SPY 下载地址:https://download.csdn.net/download/yangzhichao_csdn/85389759 2.CMD指令导入uiautomation库 pip install uiautomation 3.打开计算器&#xff0c;然后打开UISpy 如图ControlType为”ControlType.Window” 那么捕获窗口就用:uiautomation.WindowCo…

Python uiautomation初探,测试Win10计算器

在网上找 Python 客户端自动化测试的库&#xff0c;一般有 pywinauto、pywin32、pyautogui、uiautomation。本文仅对 uiautomation 做简单的了解。 MS UI Automation 是 MSAA 技术的一个替代品&#xff1a;即让控件和应用程序具有更好的可达性&#xff08;accessible&#xff…

UIAutomation 自动化

Introduction UI Automation是Microsoft .NET 3.0框架下提供的一种用于自动化测试的技术&#xff0c;是在MSAA基础上建立的&#xff0c;MSAA就是Microsoft Active Accessibility。UI Automation在某些方面超过了MSAA&#xff0c;UI自动化提供了Windows Vista中&#xff0c;微软…

Python UI自动化 编程(一) UIAutomation

Python UI自动化 编程 第一章 Python UI自动化 编程入门之打开文件夹双击文件 文章目录 Python UI自动化 编程前言一、什么是Python UI自动化 编程二、环境说明1、Python环境&#xff1a;Python 3.82、IDE&#xff1a; Pycharm3、使用的库&#xff1a;UIAutomation 三、使用步…

【python】UI自动化-uiautomation

UI自动化-uiautomation 0- 前言1- inspect2- uiautomation3- 【实战】RustDesk软件自动 安装、指定服务器信息4- 参考文章 0- 前言 做应用程序自动点击的记录&#xff0c;暂不完整&#xff0c;仅供参考。参考多位大佬文章&#xff0c;链接在后面涉及工具 inspect【应用程序元素…

CAD 双击实体事件

CAD本身为我们提供的双击事件的设置。工具-工作空间-自定义...打开用户自定界面 窗体内找到双击动作。在双击动作下我们可以看到CAD自带的所有实体 例如我们在双击三维实体时自定义一个事件。那么我们就选中三维实体-快捷特性。在右侧特性里编辑宏内容。以下是系统彼带的宏$M$(…

深入探索透视投影变换(续)

-潘宏 -2009.4.14 -本人水平有限&#xff0c;疏忽错误在所难免&#xff0c;还请各位数学高手、编程高手不吝赐教 -email: popyynetease.com -B站专栏&#xff1a; https://b23.tv/oWsl6PD 在上一篇文章中我们讨论了透视投影变换的原理&#xff0c;分析了OpenGL所使用的透视…

凯文·凯利:AI将改变一切设计工作

每一项新技术诞生之初都会引发新一轮科技恐慌周期&#xff0c;近期大火的AI生成艺术更是如此。连线杂志创始主编、知名科技思想家凯文凯利&#xff08;Kevin Kelly&#xff09;在6个月重度使用之后认为&#xff0c;这次AI进展的确是一次令人震惊的突破。但是&#xff0c;它不会…

鼠标双击退出应用程序简单实现

文章目录 Android 简单模拟鼠标双击退出应用程序&#xff0c;利用Toast提示“再点一次退出”使用Toast鼠标单击提示信息鼠标双击实现退出系统 Android 简单模拟鼠标双击退出应用程序&#xff0c;利用Toast提示“再点一次退出” 使用Toast // 参数&#xff1a;当前上下文环境&…

如何用JavaScript完美地区分双击和单击事件

通过一个悬浮球交互功能的案例来阐述问题&#xff0c;以及解决办法。 实现效果 类似微信里的悬浮窗效果&#xff0c;苹果手机的悬浮球功能效果 1.可以点击拖动&#xff0c;然后吸附在窗口边缘2.点击悬浮球&#xff0c;可以跳转界面&#xff0c;或者更改悬浮球的形态准备 1.移…

单机显示、双击隐藏;事件绑定、单击div、双击div、删除事件;元素显示、隐藏、交替; 向上收缩、向下展开、交替;淡入淡出

单机显示、双击隐藏 <style>div {width: 500px;height: 200px;background-color: green;display: none;} </style> <body><button id"btn">单击显示&#xff0c;双击隐藏</button><br><br><div> </div&…

干货分享 | UE游戏鼠标双击判定

UE虚幻引擎对于游戏开发者来说都不陌生&#xff0c;市面上有47%主机游戏使用虚幻引擎开发游戏。作为是一款游戏的核心动力&#xff0c;它的功能十分完善&#xff0c;囊括了场景制作、灯光渲染、动作镜头、粒子特效、材质蓝图等。本文介绍了虚幻引擎游戏开发过程中游戏鼠标双击判…

鼠标单击变双击问题

解决此问题可以从硬件和软件两方面思考角度入手:我们先把鼠标插在别人的机器上使用,如果没发现问题可能是软件问题,若发现同样的问题则可能是硬件方面的问题。 软件方面:(1)病毒导致将杀毒软件病毒库更新至最新版,全盘扫描。 (2)鼠标属性设置不当我们打开控制面板-&…

鼠标双击事件

随时随地阅读更多技术实战干货&#xff0c;获取项目源码、学习资料&#xff0c;请关注源代码社区公众号(ydmsq666) java中没有给出鼠标双击事件&#xff0c;虽然可以通过事件源e.getClickCount()2来判断鼠标点击次数&#xff0c;但是执行双击事件的同时也执行了单击事件&#x…

关于双击与单击事件冲突解决方案

有时候会要需求要求&#xff0c;比如附件&#xff0c;单击查看详情&#xff0c;双击下载文件时遇到的双击单击事件同时绑定一个节点。 比如单击click&#xff0c;dlbclick同时绑定时&#xff0c;双击会同时触发&#xff0c;而且click会触发两次。单用click来处理双击单击同时存…

TRUE PARTNER迎来戴维斯双击,资产规模业绩双增长

配图来自Canva可画 2020年可谓是黑天鹅乱舞的一年&#xff0c;新冠疫情肆虐全球&#xff1b;原油危机引发的资本市场动荡&#xff1b;地缘政治冲突以及美国大选&#xff0c;市场处于时不时来一波的上蹿下跳的状态当中。 在资本市场波动加剧的大环境中&#xff0c;有这样一家奇…

慧择业务布局成效明显,戴维斯双击可期

“没有一个冬天不会过去&#xff0c;没有一个春天不会到来”。 过去的一年&#xff0c;美股市场波折不断&#xff0c;尤其是2020年3月份的4次熔断&#xff0c;让股神巴菲特都惊呼“活久见”。 过去的一年&#xff0c;美股市场惊喜不断&#xff0c;道琼斯指数更是在2020年11月创…

流动性持续改善,佳源国际迎来“戴维斯双击”?

随着上半年密集的救市政策出台&#xff0c;房地产行业迎来触底回暖。 5月&#xff0c;央行以不低于市场报价利率20个基点调整首套房贷款利率下限&#xff0c;这也让当前金融环境在近几年处于较为宽松的阶段。 据克而瑞研究中心观点&#xff0c;因冲刺年中业绩&#xff0c;房企…