句柄

selenium 窗口的切换

杀马特。学长 韩版系。学妹 提交于 2019-11-27 10:02:57
窗口切换需要用到一个关键词:句柄,每个窗口唯一的标识 获取句柄的方法:driver.getWindowHandle(); 下面的例子是点击京东页面,跳转到京东手机页面,然后关闭京东页面 1 driver.get("https://www.jd.com/"); 2 driver.manage().window().maximize(); 3 Thread.sleep(2000); 4 driver.findElement(By.linkText("手机")).click(); 5 // 获取当前窗口的句柄 6 String handle = driver.getWindowHandle(); 7 System.out.println("当前窗口的句柄是:"+handle); 8 Thread.sleep(2000); 9 for (String temhandle : driver.getWindowHandles()) { //获取所有的句柄,循环判断是否是新句柄 10 if (!temhandle.equals(handle)) 11 driver.close(); 12 driver.switchTo().window(temhandle); 13 } 14 driver.findElement(By.linkText("小米")); 15 } 来源: https://www

使用windows api函数捕获SAP session的左下角消息句柄

江枫思渺然 提交于 2019-11-27 09:42:07
   背景 :SAP session的左下角消息非常有用,我们在做SAP的自动化脚本时可以设法读到这个消息的内容,作为程序后续动作的判断条件。如下图:   比如小爬之前给财务的同事制作了一个批量导出SAP各类报表的脚本工具:基于公司IT团队用ABAP编写的这几张表,SAP每次执行完导表动作,数据传输过程,左下角消息为 “Transferring package1 of 1...” ,当表格数据完整导出后,则显示 “已传输N个字节” 。我们的脚本可以去捕获“已传输...”这个消息,来判断报表内容是否已经完整导出,来决定是否要导出下一张报表。   事实上,通过原生的“脚本录制与回放”,我们可以得到这个消息:语法为: sapMessage=session.findById("wnd[0]/sbar").text 。非常简单实用!实际编写脚本过程中遇到的问题是,当我们的脚本动态地顺序往下执行到等待报表出来的过程,控制权交到了导出的excel文件,我们的sapMessage=session.findById("wnd[0]/sbar").text无法获得执行,如果该消息文本恰好作为脚本中循环退出的条件,则脚本程序因为循环无法退出,导致界面卡死。   我想到的解决方法是,前期的参数输入等都通过脚本录制功能生成代码,到了点击“执行(F8)”这个动作,改由window api

php curl_init函数用法

为君一笑 提交于 2019-11-27 08:36:09
使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网 页,然后就可以以程序的方式得到你想要的数据了。无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内 容,cURL 是一个功能强大的PHP库。 PHP中的CURL函数库(Client URL Library Function) curl_close — 关闭一个curl会话 curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数 curl_errno — 返回一个包含当前会话错误信息的数字编号 curl_error — 返回一个包含当前会话错误信息的字符串 curl_exec — 执行一个curl会话 curl_getinfo — 获取一个curl连接资源句柄的信息 curl_init — 初始化一个curl会话 curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源 curl_multi_close — 关闭一个批处理句柄资源 curl_multi_exec — 解析一个curl批处理句柄 curl_multi_getcontent — 返回获取的输出的文本流 curl_multi_info_read — 获取当前解析的curl的相关传输信息 curl_multi_init —

MFC单文档视图中嵌入GLFW窗口

我与影子孤独终老i 提交于 2019-11-27 08:08:21
开始学习OpenGL由于有一段时间,但是glfw只有窗口区,虽然通过 某种手段(移步这里) 可以加入工具栏,但仍然无法作为一个标准的GUI,而直接在MFC或Qt里面使用OpenGL API感觉有诸多制肘,各有利弊,所以打算将其嵌入GUI框架,此处以MFC为例 参考博文: https://blog.csdn.net/sunbibei/article/details/51783783 1、准备工作 由于要通过CreateProcess创建子进程的方式调用第三方exe程序,所以有必要知道创建的子进程信息,此处exe来自GLFW示例程序 1.1、查看打开窗口程序进程PID windows任务管理器 -> 进程 -> 查看 -> 选择列 -> 进程勾选PID选项 如图,同一个exe窗口程序多次重复打开之后其PID是唯一的,其他信息(名称)相同,所以首先拿到以CreateProcess方法创建子进程时的进程PID 2、对CreateProcess函数进行封装 /* * 创建子进程 * @program 被调用进程的路径 * @args 需传入的参数列表 */ HANDLE StartNewProcess(LPCTSTR program, LPCTSTR args) { HANDLE hProcess = NULL; PROCESS_INFORMATION pi; STARTUPINFO si;

JVM系列之七:HotSpot 虚拟机

房东的猫 提交于 2019-11-27 07:38:30
1. 对象的创建 1. 遇到 new 指令时 ,首先检查这个指令的参数是否能在 常量池中定位到一个类的符号引用 ,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有,执行相应的 类加载 。 2. 类加载检查通过之后,为 新对象分配内存 (内存大小在类加载完成后便可确认)。在堆的空闲内存中划分一块区域(‘指针碰撞-内存规整’或‘空闲列表-内存交错’的分配方式)。 A、假设Java堆是规整的,所有用过的内存放在一边,空闲的内存放在另外一边,中间放着一个指针作为分界点的指示器。那分配内存只是把指针向空闲空间那边挪动与对象大小相等的距离,这种分配称为“指针碰撞” B、假设Java堆不是规整的,用过的内存和空闲的内存相互交错,那就没办法进行“指针碰撞”。虚拟机通过维护一个列表,记录哪些内存块是可用的,在分配的时候找出一块足够大的空间分配给对象实例,并更新表上的记录。这种分配方式称为“空闲列表“。 C、使用哪种分配方式由Java堆是否规整决定。Java堆是否规整由所采用的垃圾收集器是否带有压缩整理功能决定。 D、分配对象保证线程安全的做法:虚拟机使用CAS失败重试的方式保证更新操作的原子性。(实际上还有另外一种方案:每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲,TLAB。哪个线程要分配内存,就在哪个线程的TLAB上分配,只有TLAB用完并分配新的TLAB时

Delphi 虚拟桌面

不想你离开。 提交于 2019-11-27 05:04:51
Delphi创建虚拟桌面实现后台调用外部程序 核心提示:最近在做的一个软件,其中有一部分功能需要调用其它的软件来完成,而那个软件只有可执行文件,根本没有源代码,幸好,我要做的事不难,只需要在我的程序启动后,将那个软件打开,在需要的时候,对其中的一个文本框设置一些文字,再点击一个按钮就可以了。... 最近在做的一个软件,其中有一部分功能需要调用其它的软件来完成,而那个软件只有可执行文件,根本没有源代码,幸好,我要做的事不难,只需要在我的程序启动后,将那个软件打开,在需要的时候,对其中的一个文本框设置一些文字,再点击一个按钮就可以了。 说到这里,相信你也有了对该功能的一些初步设想了,没错,其基本思路就是: 1)调用CreateProcess()打开目标程序。 2)用FindWindow()找到目标程序的窗口Handle。 3)找到文本框的Handle,以及按钮的MessageID,用SendMessage()方法设置文字,并触发事件。 好了,这样确实很简单吧,但是当我实现它后,却发现这样做的结果则是:当我的程序启动并打开目标程序时,它的Splash窗口,以及主窗口都将显示出来,即使当我用FindWindow()找到主窗口Handle后,调用SendMessage(WindowHandle, SW_HIDE)来隐藏该窗口,还是会有一瞬主窗口被显示出来的

delphi 多线程编程

我是研究僧i 提交于 2019-11-27 05:02:44
开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); end; end; View Code 上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试... Delphi 为我们提供了一个简单的办法(Application.ProcessMessages)来解决这个问题: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); Application.ProcessMessages; end; end; View Code 这个 Application.ProcessMessages; 一般用在比较费时的循环中, 它会检查并先处理消息队列中的其他消息. 但这算不上多线程, 譬如: 运行中你拖动窗体, 循环会暂停下来...

Java虚拟机(二)-对象创建

老子叫甜甜 提交于 2019-11-27 03:13:32
这一篇大致说明一下,对象在Java堆中对象分配、内存布局以及访问定位 1.对象的创建   虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。   类加载时,虚拟机将会给新对象分配内存,对象所需内存的大小在类加载完成后便可完全确定(在内存布局中会说明),为对象分配内存空间等通过与把一块大小确定的内存从java堆中划分出来。虚拟机分配内存有两种方式:指针碰撞和空闲列表    指针碰撞 :假设java内存都是规整的,分配完对象的内存区域和空闲区域中间放着一个指针作为分界点的指示器,那所有分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。    空闲列表 :如果Java内存是不规整的,已使用的内存和空闲内存是相互交错的,那就没有办法使用指针碰撞了,那么虚拟机就必须维护一个列表,记录那些内存块是可用的,在分配的时候从列表汇总找到一块足够大的空间划分给对象实例,并更新列表上的记录。   选择哪种分配方式是有Java堆是否规整来决定的,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理的功能决定。复制算法/标记-整理 是规整的;标记-清理 是不规整的   在并发情况下,虚拟机分配地址可能会出现冲突,解决这个问题有两种方案

【C++沉思录】句柄2

£可爱£侵袭症+ 提交于 2019-11-27 00:44:08
1、【C++沉思录】句柄1 存在问题: 句柄为了绑定到Point的对象上,必须定义一个辅助类UPoint,如果要求句柄绑定到Point的子类上,那就存在问题了。 2、有没有更简单的办法呢? 句柄使用Point*直接绑定到Point对象上(包括子类),为了保持多个句柄引用计数的一致性,使用int* 指向引用计数。 3、代码如下: #include "point.h" class Handle_2 { public: Handle_2():_p(new Point),_u(new int(1)){} Handle_2(int x,int y):_p(new Point(x,y)),_u(new int(1)){} Handle_2(const Point& rhs):_p(new Point(rhs)),_u(new int(1)){} ~Handle_2() { subRef(); } Handle_2(const Handle_2& rhs) { addRef(rhs); } Handle_2& operator=(const Handle_2& rhs) { if(this != &rhs) { subRef(); addRef(rhs); } return * this; } int GetX() { return _p->GetX(); } int GetY() {

【C++沉思录】句柄1

梦想的初衷 提交于 2019-11-27 00:43:59
1、在【C++沉思录】代理类中,使用了代理类,存在问题: a、代理复制,每次创建一个副本,这个开销有可能很大 b、有些对象不能轻易创建副本,比如文件 2、怎么解决这个问题? 使用引用计数句柄,对动态资源封装,句柄包含指针,多个句柄可以指向同一个对象。复制的时候,只是复制句柄的指针。 3、使用引用计数句柄,是为了避免不必要的对象复制,因此我们要知道有多少个句柄绑定到当前对象,也就是引用计数, 这样才能确定何时可以释放资源。 4、需要注意的是:引用计数不能是句柄的一部分,如果怎么做,当前句柄必须知道指向同一个对象的其他句柄,引用计数也要保持一致。 同时,引用计数不能成为对象的一部分,如果这样做,要求我们重写已经存在的对象类。 5、以Point类为例说明,解决办法是:增加一个新的类UPoint,包含Point对象和引用计数u,如下: class Point { public: Point():_x(0),_y(0){} Point(int x,int y):_x(x),_y(y){} Point(const Point& rhs):_x(rhs._x),_y(rhs._y){} Point& SetX(int x) { _x = x; return *this; } int GetX() { return _x; } Point& SetY(int y) { _y = y; return