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,结果一直装不上,在线装,离线装都试过了,都没用,好崩溃😭
2020-12-8
今天突然想到可能是TestNG的版本和eclipse的版本不一致导致的。
一顿百度后,果然:
这位大佬的博客介绍了:https://blog.csdn.net/weixin_44132245/article/details/86667472
据说低版本的eclipse可以在线安装,但是高版本的不行


看了一下我的eclipse,发现是低版本的呀,于是想着应该是testNG的版本不对了
这位大佬和我之前遇到的问题一样:https://www.cnblogs.com/cat-study/p/8586946.html
最后把testNG的版本换成了:
终于可以了!

生成testNG.xml文件:

2020-11-26:
今天执行时遇到了两个报错:(而且是时有时无,轮流出现这两个报错信息)


磨了我大半天了,最后发现问题还是处在等待时间的设置上

2020-12-16:
今天开始搭建maven环境
由于入职时候已经配置好maven环境了,所以直接建maven工程
但是建项目就报错了:

百度到的原因:
在仓库中找不到maven-archetype-webapp-1.0.jar
需要添加Catalog配置,步骤如下:

配置完,创建maven项目,选择Catalog找到刚配置的catalog
结果显示没有配置成功

2021-6-24:
上传图片时,在上传框的文件名输入框中输入地址时,一直提示文件名无效,试了一下午了,要疯了,没想到为了一个区区地址磨了这么久找不到原因😡

2021-7-5
找不到路径的问题困扰了好久了,百度也搜不到这种情况。今天决定在保存AutoIt脚本的时候,不加后缀名了,直接输入文件名保存:

保存完就是下图这样

然后把这个文件转换为exe

就这样,居然就成功了🙄感觉应该不是这个原因,毕竟之前也都是保存后缀名为lua的,但是也都上传成功了,这忽然不成功了,可能还是哪个细节出问题了,也可能是这种调用外部程序的办法还是不靠谱,不稳定。
看后期运行怎么样吧,如果不再出现找不到路径的问题了,那就应该是后缀名的问题了
今天又发现定位各个上传框的时候会错乱,打开的图片上传窗口却传的视屏的地址,很奇怪
2021-12-1
检查xpath路径是否正确:
打开浏览器,F12,控制台中输入$x('这里是xpath路径')

之后回车,如果路径对页面那个元素就高亮了

2021-12-2
1.关于用assert断言页面元素是否和预期的一样
String spuName = driver.findElement(By.xpath("//tr[1]/td[3]")).getText(); //这个路径就是文本的路径 System.out.println(spuName); Assert.assertEquals("四季桂", spuName);
2.关于测试报告
①在pom.xml中引用testReport所需的jar包:reportng、testng、guice
<dependency>
<groupId>org.uncommons</groupId>
<artifactId>reportng</artifactId>
<version>1.1.4</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
②在testng.xml中引用监听器,规定使用reportng生成report
<listeners>
<listener class-name="org.uncommons.reportng.HTMLReporter" />
<listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
</listeners>
③项目右键-->properties-->搜testNG-->取消使用TestNG默认的监听器



浙公网安备 33010602011771号