9. Selenium -- 常用操作方法2

上节我们已经介绍了几个常用的控件操作方法,理论上已经可以操作绝大多数控件,同样WebDriver提供了一些特殊方法,用于操作一些特殊情况。


下拉框操作

下拉框操作除了通过两次点击(1.点击下拉框,2.点击下拉框选项)外,JAVA版本的WebDriver还提供了Select 类用来专门处理下拉框元素。

HTML常见如下:

<select name="select">
  <option value="chrome">Chrome</option>
  <option value="ie">IE</option>
  <option value="firefox">Firefox</option>
  <option value="safari">Safari</option>
</select>

选取下拉选择,代码示例:

    @Test
    public void selectTest() throws InterruptedException {
        // 打开测试页面
        driver.get("file:///D:/html/index.html");
        // 定位下拉框
        WebElement selectHtml = driver.findElement(By.name("select"));
        // 实例化Select
        Select select = new Select(selectHtml);
        // 为了看效果,线程等待2S
        Thread.sleep(2000);
        // 通过下拉框文本值选取
        select.selectByVisibleText("IE");
        // 为了看效果,线程等待2S
        Thread.sleep(2000);
        // 通过下拉框索引选取
        select.selectByIndex(2);
        // 为了看效果,线程等待2S
        Thread.sleep(2000);
        // 通过 value 属性值选取
        select.selectByValue("chrome");
    }

说明:

  1. Select 类只能用于被<select></select>标签包围的元素中,也就是必须是标准下拉控件
  2. selectByVisibleText()传入的参数是option标签的text值
  3. selectByIndex() 传入的参数是option标签的索引值
  4. selectByValue() 传入的参数是option标签的value属性值

获取下拉框文本值,代码示例:

    @Test
    public void getOptionsTest(){
        // 打开测试页面
        driver.get("file:///D:/html/index.html");
        // 定位下拉框
        WebElement selectHtml = driver.findElement(By.name("select"));
        // 实例化Select
        Select select = new Select(selectHtml);
        // 获取第一个选择选项
        WebElement element = select.getFirstSelectedOption();
        // 获取第一选项的Text
        String text = element.getText();
        System.out.println(text);
        // 获取所有的选项
        List<WebElement> optionsList= select.getOptions();
        // 循环输出所有选项的Text
        for(WebElement option:optionsList){
            String optionText = option.getText();
            System.out.println(optionText);
        }
    }

说明:

  1. getFirstSelectedOption()常用与获取当前选项或者默认选项文本
  2. getOptions()用于获取所有的下拉选项,返回List

Alert的操作

测试用例:

1. 打开“UI自动化测试”主页
2. 点击Alert按钮
3.  在alert警告框点击确定按钮

代码实现:

    @Test
    public void alertTest() throws InterruptedException {
        driver.get("file:///C:/selenium_html/index.html");
        driver.findElement(By.className("alert")).click();
        Thread.sleep(3000);
        // 把控制权转交给 alert
        Alert alert = driver.switchTo().alert();
        // 获取警告框的文本值
        String text = alert.getText();
        System.out.println(text);
        // 点击警告窗确定按钮
        alert.accept();
    }

说明:

Alert警告窗无法通过正常元素那样去定位警告窗,所以自然就无法直接调用click()方法去点击确定按钮。所以想要处理alert警告窗我们需要把driver控制权转移给alert类型,然后调用alert的getText()的方法获取警告窗文本,调用accept()方法去模拟点击确定按钮。


Confirm的操作

测试用例:

1. 打开“UI自动化测试”主页
2. 点击Confirm按钮
3.  在Confirm警告框点击确定\取消按钮

代码实现:

    @Test
    public void confirmTest() throws InterruptedException {
        driver.get("file:///C:/selenium_html/index.html");
        driver.findElement(By.className("confirm")).click();
        Thread.sleep(3000);
        // driver控制权转交给 alert
        Alert alert = driver.switchTo().alert();
        // 点击取消
        alert.dismiss();
        Thread.sleep(3000);
        // 点击确定
        alert.accept();
    }

说明:

confirm弹窗类似alert,但是多了个取消按钮,如果想模拟点击取消按钮操作,我们需要调用dismiss()方法实现。


Prompt的操作

测试用例:

1. 打开“UI自动化测试”主页
2. 点击Prompt按钮
3. 在Prompt 弹窗中,输入“这个是Prompt”
4.  点击确定\取消按钮

代码实现:

    @Test
    public void promptTest() throws InterruptedException {
        driver.get("file:///C:/selenium_html/index.html");
        driver.findElement(By.className("prompt")).click();
        Thread.sleep(3000);
        // driver控制权转交给 alert
        Alert alert = driver.switchTo().alert();
        // 往弹窗输入 文本
        alert.sendKeys("这个是Prompt");
        Thread.sleep(2000);
        alert.accept();
        Thread.sleep(3000);
        alert.accept();
        Thread.sleep(3000);
    }

说明:

操作基本同以上两钟警告窗,但是prompt弹窗多了可输入的文本框,同样无法定位,所以要操作文本框可以调用alert的sendKeys()方法实现。


iFrame 的操作

思路:

1. 定位iFrame
2. driver控制权交给iFrame
3. 操作iFrame里面的元素
4. 操作完成把driver控制权交回原页面

测试用例:

1. 打开“UI自动化测试”主页
2. 在frame:input 输入框输入文本

代码实现:

    @Test
    public void iframeTest() throws InterruptedException {
        driver.get("file:///C:/selenium_html/index.html");
        // 通过 ID 或者 name 方式 转交控制权
        //driver.switchTo().frame("aa");

        WebElement iframe = driver.findElement(By.tagName("iframe"));
        // 通过webelement 方式转交driver控制权
        driver.switchTo().frame(iframe);
        driver.findElement(By.linkText("baidu")).click();
        Thread.sleep(3000);
        // driver 控制权转交给原来界面
        driver.switchTo().defaultContent();
        driver.findElement(By.linkText("登陆界面")).click();
    }

说明:

driver.switchTo().frame("aa")中“aa”默认为frame元素的id或者name的属性值。如果frame元素没有id也没有name那么我们完全可以用其它定位到frame然后传入一个WebElemet元素便可。


多窗口操作

思路:

  1. 获取当前窗口的handle值
  2. 获取所有窗口的handle值
  3. 循环判断所有的窗口的handle值,如果不为第一步获取的值,则跳转

测试用例:

  1. 打开“UI自动化测试”页面
  2. 点击“Open new window”
  3. 在新开的界面iframe:input 文本框输入文本
  4. 关闭新开的窗口
  5. 再原来的界面文本框输入文本

代码实现:

    @Test
    public void testWin() throws InterruptedException {
        driver.get("file:///C:/selenium_html/index.html");
        // 当前driver所在的页面的 句柄值
        String handle1 = driver.getWindowHandle();
        driver.findElement(By.linkText("Open new window")).click();
        Thread.sleep(3000);
        // For 循环判断 获取到的handles是否等于handle1
        for (String handles : driver.getWindowHandles()) {
            if (handles.equals(handle1)) {
                continue;
            }
            driver.switchTo().window(handles);
        }
        driver.findElement(By.linkText("baidu")).click();
        // driver 控制权交回第一个窗口
        driver.switchTo().window(handle1);
    }

上传文件的处理

上传文件操作需要弹出我们的win窗口,而win窗口我们是无法通过WebDriver去识别元素做操作,那是不是意味着上传文件我们WebDriver就无法完成呢?
其实相反,上传文件操作非常容易,我们还是可以通过已经学过的sendKeys()方法完成。

思路:

1. 定位上传控件
2. 使用sendKeys()方法,并传入文件路径

测试用例:

1. 打开“UI 测试页面”
2. 实现上传操作

代码实现:

    @Test
    public void uploadTest() {
        driver.get("file:///C:/selenium_html/index.html");
        // 定位上传控件,传入本地文件路径
        driver.findElement(By.id("load")).sendKeys("c:\\a.html");
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容