5.java+selenium+maven:特殊元素定位
一、三大切换
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完成
五、验证码
去除验证
万能验证码
自动识别