seleniumUI自动化学习记录
阅读原文时间:2023年07月08日阅读:2

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

 is not clickable at point (115,358) because another element
 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/(官网: href="https://testng.org/doc/download.html">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的版本换成了:终于可以了!

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

③项目右键-->properties-->搜testNG-->取消使用TestNG默认的监听器