2019.2.9
尝试了一个启动浏览器并打开指定网址的程序:
这里首先要注意的就是浏览器的版本和selenium jar包的版本必须符合才行,不然会报错
2019.9.16
必须要下载相应的chromedriver.exe放在eclipse工作空间,相应项目的根目录下,chromedriver下载地址:http://chromedriver.storage.googleapis.com/index.html
尝试了很多版本组合,最后发现Firefox_45.0.1,selenium-2.53.0这两个版本没毛病了
2019.11.5
chromedriver和浏览器的版本必须对应,而浏览器总是自动升级,这样项目就会报错,
所以需要防止谷歌浏览器自动更新:
首先删除安装目录中的Update文件夹中的内容:
如果提示程序占用删除不了,就在任务管理器中杀掉进程
然后把这个文件夹的属性改一下:
记录一个bug:
Exception in thread "main" org.openqa.selenium.StaleElementReferenceExceptionstale element reference: element is not attached to the page document
这个报错意思是找得到元素,但是它不在当前可见的页面上,原因:上个操作和下个操作间隔时间太短,代码执行速度比页面渲染速度快。
解决办法:在哪步操作致使页面加载很慢的地方加上等待时间即可
eg:
等待的时间根据页面响应速度自行调整
2020-2-20:
selenium官网下载地址:https://www.selenium.dev/downloads/
页面元素定位是自动化中最重要的事情, selenium Webdriver 提供了很多种元素定位的方法
基本步骤为:定位元素、操作元素、验证操作结果、记录测试结果
在自动化测试过程中, 测试程序通常的操作页面元素步骤
1. 找到Web的页面元素,并赋予到一个存储对象中 (WebElement)
2. 对存储页面元素的对象进行操作, 例如:点击链接,在输入框中输入字符等
3. 验证页面上的元素是否符合预期
2020-7-1:
操作滚动条
// 点击商户下拉框时,由于webdriver只能操作页面可见的元素,所以需要下拉滚动条定位元素 JavascriptExecutor js = (JavascriptExecutor)driver; // 循环下拉 /* for (int i = 0; i < 10; i++) { js1.executeScript("scrollTo(0,"+(i * 500)+")"); waitTime(2000); } */ //向下拉10000 js.executeScript("scrollTo(0,10000)");scrollTo() 方法用于设置浏览器窗口滚动条的水平和垂直位置。方法的第一个参数表示水平的左间距,第二个参数表示垂直的上边距(0是最上面,10000是最底部) Thread.sleep(1000); WebElement storequerymerchant1 = driver.findElement(By.xpath("//*[@id='searchForm']/div[1]/div[1]/div[1]/div/div/dl/dd[21]"));//定位下拉框滑动后的指定的选项 storequerymerchant1.click();//点击下拉框里的选项
2020-8-5
layui日期控件选择操作:
// 日期控件操作 /* * 使用js定位日期控件,并去掉控件的readonly属性 */ String js = "document.getElementById('test-laydate-range-datetime').removeAttribute('readonly');"; ((JavascriptExecutor) driver).executeScript(js); /* * 清空日期控件中的值,并输入目标日期值; */ WebElement datePicker = driver.findElement(By.id("test-laydate-range-datetime")); datePicker.clear(); Thread.sleep(1000); datePicker.sendKeys("2019-11-15 00:00:00 - 2019-11-15 23:59:59");
对于页面含有iframe框架的处理方法:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// 定位iframe元素(如上图1所示,因为商户管理模块外就有iframe,所以在进入该模块操作页面前,就要处理iframe) WebElement iframe = driver.findElement(By.xpath("//*[@id='LAY_app_body']/div[2]/iframe")); driver.switchTo().frame(iframe); ==================== ------
这里是iframe下的商户管理页面操作
------- ==================== 下面开始要切换左侧导航菜单(上面商户管理模块操作完毕,左侧导航栏要切换到门店管理模块,所以要进行多窗口切换) /* * 处理浏览器多窗口切换 */ // 获取当前页面句柄 String handle = driver.getWindowHandle(); // 获取所有页面的句柄,并循环判断不是当前的句柄(页面A,切换到页面B,同时关闭页面A,页面B点击触发页面C) for (String temhandle : driver.getWindowHandles()) { if (!temhandle.equals(handle)) driver.close(); driver.switchTo().window(temhandle); } ===================== ----
这里写左侧导航栏点击【门店管理】操作
-----
===================== //得到当前窗口的句柄 String currentWindow = driver.getWindowHandle(); //得到所有窗口的句柄 Set<String> handles = driver.getWindowHandles(); //不包括当前窗口 handles.remove(currentWindow); //判断是否存在窗口 System.out.println(handles.size()); if (handles.size() > 0) { try{ //定位窗口 driver.switchTo().window(handles.iterator().next()); }catch(Exception e){ System.out.println(e.getMessage()); } } // frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此需要先定位到相应的frame,对那个页面里的元素进行定位 // 先定位到iframe WebElement iframestore = driver.findElement(By.xpath("//*[@id='LAY_app_body']/div[4]/iframe")); // 再将定位对象传给switch_to_frame()方法 driver.switchTo().frame(iframestore); Thread.sleep(1000);
======================
------
这里开始写门店管理页面的操作
------- ========================
end,
iframe中的内容操作完成后,
driver.switchTo().defaultContent();//完成当前表单操作后,通过此方法跳出表单
2020-8-5
报错:
一、
org.openqa.selenium.ElementClickInterceptedException: Element <div class="el-submenu__title"> is not clickable at point (115,358) because another element <div class="el-loading-mask is-fullscreen el-loading-fade-leave-active el-loading-fade-leave-to"> obscures it
错误的意思是:无法点击这个元素,另外一个div元素接收了这个点击。
方法一:
先使用invisibilityOf等待掩盖的div消失不见,再使用elementToBeClickable等待要点击的元素达到可点击的状态。
//要点击的左侧菜单元素 WebElement LeftMenu = driver.findElement(By.xpath("xpath")); //掩盖的div元素 WebElement ObscureDiv = driver.findElement(By.xpath("//div[@class='el-loading-mask is-fullscreen el-loading-fade-leave-active el-loading-fade-leave-to']")); //使用显示等待,等待掩盖的div消失 WebDriverWait wait = new WebDriverWait(driver,60); wait.until(ExpectedConditions.invisibilityOf(ObscureDiv)); //等待左侧菜单到可点击状态 wait.until(ExpectedConditions.elementToBeClickable(LeftMenu )); //之后再执行点击 LeftMenu .click();
方法二:
因为掩盖的div可能会在进行一些操作后,会消失,所以登录后执行一个页面刷新的操作,此div即可消失。再等待左侧菜单到可点击状态即可。
//登录之前的代码 //登录后加时间等待,并且进行一次页面刷新 Thread.sleep(3000); driver.navigate().refresh(); //要点击的左侧菜单元素 WebElement LeftMenu = driver.findElement(By.xpath("xpath")); //等待左侧菜单到可点击状态 WebDriverWait wait = new WebDriverWait(driver,60); wait.until(ExpectedConditions.elementToBeClickable(LeftMenu )); //之后再执行点击 LeftMenu .click();
2020-10-28:
重新打开一个iframe页面,有时定位不到iframe元素,需要处理页面跳转
String handle2 = driver.getWindowHandle(); // 获取所有页面的句柄,并循环判断不是当前的句柄(页面A,切换到页面B,同时关闭页面A,页面B点击触发页面C) for (String temhandle : driver.getWindowHandles()) { if (!temhandle.equals(handle2)) driver.close(); driver.switchTo().window(temhandle); // 定位iframe元素 WebElement iframe_updatestore = driver.findElement(By.xpath("//*[@id='LAY_app_body']/div[5]/iframe")); driver.switchTo().frame(iframe_updatestore);
2020-11-6:
关于图片上传:
因为后台的上传文件框不是input,要操作windows控件,但selenium只能操作网页元素。之前试了很多办法,但都失败了,最后决定借助AutoIT这个工具了
需要下载两个组件,下载地址如下:
代码编辑器scite的下载地址:
http://www.scintilla.org/SciTE.html
关于此编辑器的操作介绍:https://blog.csdn.net/rshp_520/article/details/38427339
AutoIt下载地址:(它用于Windows GUI(图形用户界面)的自动化操作,利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务)
https://www.autoitscript.com/site/autoit/downloads/
关于这三个组件的介绍:
AutoIt Windows Info 用于识别Windows控件信息
Compile Script to.exe 用于将AutoIt生成 exe 执行文件
Run Script 用于执行AutoIt脚本、SciTE Script Editor 用于编写AutoIt脚本
2020-11-9:
上周决定用AutoIt来实现图片上传了,走了遍流程,但没成功。趁现在项目不忙,再研究下
以下是过程中参考的博客:
https://www.jb51.net/article/121889.htm
https://blog.csdn.net/u011541946/article/details/74359517
https://blog.csdn.net/youanyyou/article/details/83725414
https://www.cnblogs.com/yblafxw/p/9810023.html
https://blog.csdn.net/ak739105231/article/details/89394606
http://www.manongjc.com/detail/8-fmwwffjxescjjnm.html
http://www.51testing.com/html/55/n-3707755-2.html
https://www.jianshu.com/p/6f6bb723fe37
补充:
ChromeDriver不同版本的驱动: https://npm.taobao.org/mirrors/chromedriver/
对应谷歌浏览器下载对应驱动:http://chromedriver.storage.googleapis.com/index.html
实现步骤:
一、定位windows窗口上的元素(使用 )
①:首先定位文件名输入框:class 为“Edit”,Instance为“1”
②:定位【打开】按钮,class 为“Button”,Instance为“1”
二、编写脚本(使用)
①:首先设置编码,不然会乱码
②编写脚本(根据控件Finder Tool识别到的信息来调用函数编写脚本)
ControlFocus("打开", "","Edit1") WinWait("[CLASS:#32770]","",10) ControlSetText("打开", "", "Edit1","D:\testfile.png") Sleep(2000) ControlClick("打开", "","Button1");
以上各行脚本的含义:
//定位到选择文件窗口
ControlFocus ( "窗口标题", "窗口文本", 控件ID) 设置输入焦点到指定窗口的某个控件上
//等待元素出现,时间为20s
WinWait ( "[CLASS":class的值" ], 超时时间 ) 暂停脚本的执行直至指定窗口存在(出现)为止
//向文件名输入框输入本地要上传文件的路径
ControlSetText ( "窗口标题", "窗口文本", 控件ID, "新文本" ) 修改指定控件的文本
// Sleep ( 延迟 ) 使脚本暂停指定时间段
//点击打开按钮
ControlClick ( "窗口标题", "窗口文本", "控件ID") 向指定控件发送鼠标点击命令
其中,title即Basic Window Info识别出的Title值,control ID即Basic Control Info识别出的Class和Instance的拼接,如上图拼接后的结果应为Button1
③写好脚本保存,保存后才能运行
④运行脚本(目前还看不懂运行后输出的内容是啥意思)
三、将刚刚写的脚本转成exe可执行文件(使用,是为了这个脚本能被java 程序调用,所以需要通过这个工具生成exe文件)
转化完成后,页面会有成功的提示语,之后就在桌面上得到了一个exe文件:
验证这个文件是否能执行成功的方法:
按上述步骤操作后,若能把图片传上去就说明exe能执行成功
四、在java脚本中调用exe文件
// 点击上传图片区域 WebElement upload = driver.findElement(By.xpath("//*[@id='icon1']")); upload.click(); Runtime.getRuntime().exec("C:\\Users\\caiman\\Desktop\\upload.exe");
目前这样执行后一直报错:
2020-11-9-17:00,折腾了大半天了,终于找到原因了
是因为在调用exe之前没有加上等待时间。加上等待时间后就能上传成功了
// 点击上传图片区域 WebElement upload = driver.findElement(By.xpath("//*[@id='icon1']")); upload.click(); Thread.sleep(3000); // 通过Runtime对象调用exe方法 Runtime.getRuntime().exec("C:\\Users\\caiman\\Desktop\\upload.exe");
另一种写法:
Thread.sleep(3000); // 设置等待3秒 Runtime exe = Runtime.getRuntime(); // Java 的Runtime 模块的getruntime.exec()方法可以调用exe 程序并执行。 try { String str = "C://Users//caiman//Desktop//upload.exe"; exe.exec(str); // 运行指定位置的.exe文件 } catch (IOException e) { System.out.println("Error to run the exe"); e.printStackTrace(); }
关于exe的路径也可放在项目下面:写相对路径
2020-11-12:
目前所有代码都是写在一个类中的,长此下去肯定不是办法,该想想办法把用例理一下了
首先安装TestNg:
eclipse中在线安装方式:
(注:此安装过程慢的令人发指!晚上没关机下了一晚上,才刚把要下载的东西下完,第二天过来还要继续看不到头的安装。。。。。)
地址: http://dl.bintray.com/testng-team/testng-eclipse-release/(官网:https://testng.org/doc/download.html)
过程要等五分钟左右,才会搜到TestNG
接下来等待安装完成即可
第二种:离线安装方式
点击release版地址:https://dl.bintray.com/testng-team/testng-eclipse-release/.
点击最后一个“zipped”,选择与浏览器匹配的版本进行下载
下载后解压目录如下:
可以把features和plugins中的内容分别拷贝到eclipse对应文件夹,或把解压后的整个目录拷贝到dropins中,之后重启eclipse
但是以上操作后,并没有安装成功
查看安装成功办法:File--->New--->Other--->看是否能搜到TestNG
2020-12-2
这几天一直在安装TestNG,结果一直装不上,在线装,离线装都试过了,都没用,好崩溃
标签:控件,exe,记录,seleniumUI,driver,点击,iframe,自动化,页面 From: https://www.cnblogs.com/160312/p/10358500.html