一、三大切换

1.切换iframe

想要定位iframe中的元素时,由于driver的焦点还停留再原页面,再iframe新的页面上定位元素时,会产生报错,所以需要将driver的焦点切换到iframe页面中

切换方式:driver.switchTo().frame(WebElement)

跳转到父级iframe:driver.switchTo().parentFrame()

回到默认内容页面:driver.switchTo().defaultContent()

WebDriver driver = openBrowser("chrome");
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.get("https://ke.qq.com/?tuin=54f4618b");
driver.findElement(By.id("js_login")).click();
//如果iframe没有id或者name属性,可以先定位到该iframe,然后再去切换
WebElement iframeElement = driver.findElement(By.xpath("//iframe[contains(@src,'low_login_enable')]"));
driver.switchTo().frame(iframeElement);
driver.findElement(By.id("swither_plogin")).click();
//输入qq号
driver.findElement(By.id("u")).sendKeys("111111");
driver.findElement(By.id("p")).sendKeys("123456");
driver.findElement(By.id("login_button")).click();
//点击关闭按钮
driver.switchTo().parentFrame();
driver.findElement(By.xpath("//a[@class='login-close'/i]")).click();

2.切换Alert

得到alert框:Alert alert = driver.switchTo().alert();

常用API:

        alert.getText():获取警告框中的提示信息

        alert.accept():确定按钮

        alert.dismiss():取消按钮

3.切换window
当点击了a标签元素时,会触发打开连接页面的事件,有两种情形:

    再当前窗口加载新页面内容

    新建一个窗口加载新页面内容,这种情况在a标签有target="_blank"时触发,此时需要切换窗口

切换方式:传入要操作窗口的handle句柄,driver.switchTo().window(nameOrHandle);

获取窗口句柄:

        driver.getWindowHandle():获取当前操作窗口的句柄

        driver.getWindowHandles():获取测试时代开的所有窗口句柄

driver.get("https://www.baidu.com");
    Set<String> handles1 = driver.getWindowHandles();
    System.out.println(handles1);
    driver.findElement(By.xpath("//a[text()='新闻']")).click();
    Set<String> handles2 = driver.getWindowHandles();
    System.out.println(handles2);
    switchWindow("百度新闻--海量中文资讯平台");
    driver.quit();
}

public static void switchWindow(String title) {
    Set<String> allHandles = driver.getWindowHandles();
    for (String handle : allHandles) {
        //判断是不是对应的句柄
        if (driver.getTitle().equals(title)){
            //符合,跳出循环
            break;
        }else {
            //切换窗口
            driver.switchTo().window(handle);
        }
    }
}

二、鼠标操作

自动化测试时,有些元素不适合直接点击或者进行某些操作时,可以使用Selenium的Actions类来模拟鼠标键盘操作,通过Actions对象可以发起鼠标左键、右键、移动鼠标等操作,最后使用perform方法执行操作

clickAndHold():在特定元素上单机鼠标左键(不释放)

release():在特定元素上释放鼠标左键

doubleClick():在特定元素上双击鼠标左键

moveToElement():移动鼠标指针到特定元素

contextClick():在特定元素上右键单击

dragAndDrop():拖拽元素

perform():执行具体的操作,前面方法都是声明一个操作,只有调用perform后才会真正执行操作

Actions:在操作一个页面元素的时候需要一连串的动作配合的时候,可以使用Actions来完成

actions.clickAndHold(onElement).moveToElement(toElement).release().build().perform();

Actions actions = new Actions(driver);
//1.移动鼠标
driver.get("https://www.baidu.com");
driver.manage().window().maximize();
actions.moveToElement(driver.findElement(By.id("s-usersetting-top"))).perform();
//2.鼠标拖拽
Thread.sleep(2000);
driver.get("http://www.treejs.cn/v3/demo/cn/exedit/drag.html");
//定位到【随意拖拽1-1】元素
WebElement webElement1 = driver.findElement(By.id("treeDemo_2_span"));
//定位到【随意拖拽1-2】元素
WebElement webElement2 = driver.findElement(By.id("treeDemo_3_span"));
actions.clickAndHold(webElement1).moveToElement(webElement2).release().perform();

三、JavaScript

某些特殊情况下,使用selenium的API无法操作页面元素,可以考虑通过执行js来完成

使用方式1:

            JavascriptExecutor js = (JavascriptExecutor)driver;

            js.executeSrcipt("…");

使用方式2:

            WebElement element = driver.findElement(By.id("xxx"));

            JavascriptExecutor js = (JavascriptExecutor)driver;

            js.executeSrcipt("arguments[0…]",element);

使用场景:

    设置/去除元素属性:setAttribut/removeAttribute

    页面滚动:

            window.scrollTo(0,document.body.scrollHeight):滚动到页面最底部

            element.scrollIntoViewIfNeeded(true):滚动到指定元素的位置

    元素无法被点击:

            WebElement element = driver.findElement(By.id("login"));

            JavascriptExecutor js = (JavascriptExecutor)driver;

            js.executeSrcipt("arguments[0]",element);

driver.get("https://www.12306.cn/index/");
//得到JavaScriptExcutor对象
JavascriptExecutor js = (JavascriptExecutor)driver;
//1.改变元素属性
js.executeScript("document.getElementById('train_date').removeAttribute('readonly');");
Thread.sleep(1000);
driver.findElement(By.id("train_date")).clear();
driver.findElement(By.id("train_date")).sendKeys("2022-04-09");

//2.滚动滚动条
js.executeScript("window.scrollTo(0,document.body.scrollHeight);");
js.executeScript("document.getElementById('index_ads').scrollIntoViewIfNeeded(true);");

//3.特殊元素无法通过常规click方法点击情况
driver.get("https://prepc.ketangpai.com/#/homePage");
js.executeScript("arguments[0].click()",driver.findElement(By.xpath("//span[text()='登录']")));

四、文件上传

情况1:<input tye="file" id="fu" value="选择文件">

因为上传文件会需要打开windows文件选择窗口,而selenium时无法操作这个窗口的

解决办法:使用sendKeys写入文件的路径

情况2:如果文件上传不是input元素,而是使用的第三方的空间,需要使用第三方工具,例如AutoIT完成

五、验证码

去除验证

万能验证码

自动识别

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注