软件测试相关【selenium】【二次封装】【Java版本】
1 package com.yanfuchang.selenium.utils; 2 3 import java.awt.AWTException; 4 import java.awt.Robot; 5 import java.awt.event.KeyEvent; 6 import java.io.File; 7 import java.io.IOException; 8 import java.net.MalformedURLException; 9 import java.net.URL; 10 import java.text.SimpleDateFormat; 11 import java.util.Date; 12 import java.util.HashMap; 13 import java.util.List; 14 import java.util.Map; 15 import java.util.Set; 16 import java.util.concurrent.TimeUnit; 17 import org.apache.commons.io.FileUtils; 18 import org.openqa.selenium.Alert; 19 import org.openqa.selenium.By; 20 import org.openqa.selenium.Cookie; 21 import org.openqa.selenium.Dimension; 22 import org.openqa.selenium.JavascriptExecutor; 23 import org.openqa.selenium.Keys; 24 import org.openqa.selenium.NoAlertPresentException; 25 import org.openqa.selenium.NoSuchElementException; 26 import org.openqa.selenium.OutputType; 27 import org.openqa.selenium.TakesScreenshot; 28 import org.openqa.selenium.WebDriver; 29 import org.openqa.selenium.WebDriverException; 30 import org.openqa.selenium.WebElement; 31 import org.openqa.selenium.chrome.ChromeDriver; 32 import org.openqa.selenium.firefox.FirefoxDriver; 33 import org.openqa.selenium.firefox.FirefoxProfile; 34 import org.openqa.selenium.ie.InternetExplorerDriver; 35 import org.openqa.selenium.interactions.Actions; 36 import org.openqa.selenium.interactions.HasInputDevices; 37 import org.openqa.selenium.interactions.Keyboard; 38 import org.openqa.selenium.remote.DesiredCapabilities; 39 import org.openqa.selenium.remote.RemoteWebDriver; 40 import org.openqa.selenium.support.ui.ExpectedConditions; 41 import org.openqa.selenium.support.ui.Select; 42 import org.openqa.selenium.support.ui.WebDriverWait; 43 44 /** 45 * 基于selenium的二次封装 46 */ 47 public class WebDriverUtil { 48 private static WebDriver driver = null; 49 private static Select select = null; 50 private static Alert alert = null; 51 private static WebElement element = null; 52 private static List<WebElement> elementList = null; 53 private static long timeOutInSeconds = 10; 54 //--------------------自定义常量------------------------ 55 public final String LINE = "\r\n"; 56 public final String smile = "^_^"; 57 public final String sad = "*o*"; 58 59 public WebDriverUtil(long timeOutInSeconds) { 60 WebDriverUtil.timeOutInSeconds = timeOutInSeconds; 61 } 62 63 public WebDriverUtil() {} 64 65 /** 66 * 指定浏览器打开URL 67 */ 68 public static void openBrowser(String url, String browser) { 69 driver = initBrowser(browser); 70 driver.manage().timeouts().implicitlyWait(timeOutInSeconds, TimeUnit.SECONDS); 71 driver.get(url); 72 } 73 /** 74 * 指定浏览器打开URL 75 */ 76 public static void openBrowser(String url) { 77 driver = initBrowser(); 78 driver.get(url); 79 } 80 81 /** 82 * 初始化浏览器,方式1 83 * Firefox 84 */ 85 public static WebDriver initBrowser() { 86 /* 87 * 谷歌浏览器 System.setProperty("webdriver.chrome.driver", 88 * "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe"); 89 * WebDriver driver = new ChromeDriver(); driver.get("http://www.baidu.com/"); 90 */ 91 FirefoxProfile profile = new FirefoxProfile(); 92 profile.setPreference("browser.download.manager.showWhenStarting", false);// 是否显示下载进度框 93 profile.setPreference("browser.offline-apps.notify", false);// 网站保存离线数据时不通知我 94 profile.setPreference("browser.helperApps.alwaysAsk.force", false);// 应用程序设置不询问 95 profile.setPreference("browser.download.folderList", 0);// 设置下载地址0是桌面;1是“我的下载”;2是自定义 96 profile.setPreference("browser.helperApps.neverAsk.saveToDisk", 97 "application/octet-stream, application/vnd.ms-excel, text/csv, application/zip, application/msword"); 98 profile.setPreference("dom.webnotifications.enabled", false);// 允许通知 99 WebDriver driver = new FirefoxDriver(profile);// 启动火狐浏览器 100 driver.manage().window().maximize();// 设置窗口大小 101 driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);// 设置页面加载超时 102 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);// 设置查询组件等待时间 103 return driver; 104 } 105 106 /** 107 * 初始化浏览器,方式2 108 * (ie, ff, chrome) 109 */ 110 private static WebDriver initBrowser(String browser) { 111 switch (browser) { 112 case "ie": 113 System.setProperty("webdriver.ie.driver", ".\\Tools\\IEDriverServer.exe"); 114 driver = new InternetExplorerDriver(); 115 break; 116 case "ff": 117 case "firefox": 118 case "Firefox": 119 case "FireFox": 120 /** 121 * FireFox安装方式为默认安装: 122 * FireFox版本小于48 123 * System.setProperty("webdriver.firefox.marionette", ".\\Tools\\geckodriver.exe"); 124 * FireFox版本大于48,默认安装时可以试试,应该可以 125 * System.setProperty("webdriver.gecko.driver", ".\\Tools\\geckodriver.exe"); 126 */ 127 // FireFox安装方式为自定义安装 128 System.setProperty("webdriver.firefox.bin", "D:\\ProgramFiles\\Mozilla Firefox\\firefox.exe"); 129 driver = new FirefoxDriver(); 130 break; 131 case "chrome": 132 case "Chrome": 133 System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe"); 134 driver = new ChromeDriver(); 135 break; 136 default: 137 try { 138 throw new Exception("浏览器错误!"); 139 } catch (Exception e) { 140 e.printStackTrace(); 141 } 142 } 143 return driver; 144 } 145 146 //----------------------------------------------------元素相关----------------------------------------------------------------------------- 147 /** 148 * 查找元素 149 * @param by 传入一个类型 例如:name 150 * @param byValue 传入一个类型值 例如:username 151 */ 152 public WebElement findElement(String by, String byValue) { 153 try { 154 switch (by) { 155 case "id": 156 element = driver.findElement(By.id(byValue)); 157 break; 158 case "name": 159 element = driver.findElement(By.name(byValue)); 160 break; 161 case "class": 162 element = driver.findElement(By.className(byValue)); 163 break; 164 case "tag": 165 element = driver.findElement(By.tagName(byValue)); 166 case "link": 167 element = driver.findElement(By.linkText(byValue)); 168 break; 169 case "partiallinktext": 170 element = driver.findElement(By.partialLinkText(byValue)); 171 case "css": 172 element = driver.findElement(By.cssSelector(byValue)); 173 break; 174 case "xpath": 175 element = driver.findElement(By.xpath(byValue)); 176 break; 177 default: 178 throw new RuntimeException("输入的定位类型未在程序中定义,类型为:" + byValue); 179 } 180 } catch (Exception e) { 181 System.out.println("没有找到元素:" + byValue); 182 } 183 return element; 184 } 185 /** 186 * 查找一组元素 187 * @param by 传入一个类型 例如:name 188 * @param byValue 传入一个类型值 例如:username 189 */ 190 public List<WebElement> findElements(String by, String byValue) { 191 try { 192 switch (by) { 193 case "id": 194 elementList = driver.findElements(By.id(byValue)); 195 break; 196 case "name": 197 elementList = driver.findElements(By.name(byValue)); 198 break; 199 case "class": 200 elementList = driver.findElements(By.className(byValue)); 201 break; 202 case "tag": 203 elementList = driver.findElements(By.tagName(byValue)); 204 case "link": 205 elementList = driver.findElements(By.linkText(byValue)); 206 break; 207 case "partiallinktext": 208 elementList = driver.findElements(By.partialLinkText(byValue)); 209 case "css": 210 elementList = driver.findElements(By.cssSelector(byValue)); 211 break; 212 case "xpath": 213 elementList = driver.findElements(By.xpath(byValue)); 214 break; 215 default: 216 throw new RuntimeException("输入的定位类型未在程序中定义,类型为:" + byValue); 217 } 218 } catch (Exception e) { 219 System.out.println("没有找到元素:" + byValue); 220 } 221 return elementList; 222 } 223 224 /** 225 * 获取单个元素 226 */ 227 public WebElement findElementByXpath(String xpath) { 228 return driver.findElement(By.xpath(xpath)); 229 } 230 public WebElement findElementByTag(String tag) { 231 return driver.findElement(By.tagName(tag)); 232 } 233 public WebElement findElementById(String id) { 234 return driver.findElement(By.id(id)); 235 } 236 public WebElement findElementByClassName(String name) { 237 return driver.findElement(By.className(name)); 238 } 239 public WebElement findElementByText(String text) { 240 return driver.findElement(By.linkText(text)); 241 } 242 public WebElement findElementByPartialText(String text) { 243 return driver.findElement(By.partialLinkText(text)); 244 } 245 public WebElement findElementByName(String name) { 246 return driver.findElement(By.name(name)); 247 } 248 249 /** 250 * 获取多个元素 251 */ 252 public List<WebElement> findElementsByClassName(String className) { 253 return driver.findElements(By.className(className)); 254 } 255 public List<WebElement> findElementsByText(String text) { 256 return driver.findElements(By.linkText(text)); 257 } 258 public List<WebElement> findElementsByPartialText(String text) { 259 return driver.findElements(By.partialLinkText(text)); 260 } 261 public List<WebElement> findElementsById(String id) { 262 return driver.findElements(By.id(id)); 263 } 264 public List<WebElement> findElementsByTag(String tag) { 265 return driver.findElements(By.tagName(tag)); 266 } 267 268 /** 269 * 获取一组元素中的指定元素 270 */ 271 public WebElement FindByElements(By by, int index) { 272 WebElement element = null; 273 if (this.elementsExists(by)) { 274 element = driver.findElements(by).get(index); 275 } 276 return element; 277 } 278 279 /** 280 * 查找元素并点击 281 * @param by 传入一个类型 例如:name 282 * @param byValue 传入一个类型值 例如:username 283 */ 284 public boolean findElementClick(String by, String byValue) { 285 try { 286 switch (by) { 287 case "id": 288 driver.findElement(By.id(byValue)).click(); 289 return true; 290 case "name": 291 driver.findElement(By.name(byValue)).click(); 292 return true; 293 case "class": 294 driver.findElement(By.className(byValue)).click(); 295 return true; 296 case "tag": 297 driver.findElement(By.tagName(byValue)).click(); 298 case "link": 299 driver.findElement(By.linkText(byValue)).click(); 300 return true; 301 case "partiallinktext": 302 driver.findElement(By.partialLinkText(byValue)).click(); 303 case "css": 304 driver.findElement(By.cssSelector(byValue)).click(); 305 return true; 306 case "xpath": 307 driver.findElement(By.xpath(byValue)).click(); 308 return true; 309 default: 310 throw new RuntimeException("输入的定位类型未在程序中定义,类型为:" + byValue); 311 } 312 } catch (Exception e) { 313 System.out.println("*****没有找到元素,类型为::" + by + "属性值为:" + byValue + " 的元素或者该元素无法点击****"); 314 return false; 315 } 316 } 317 318 /** 319 * 定位元素并点击 320 */ 321 public void findElementByIdAndClick(String id) { 322 driver.findElement(By.id(id)).click(); 323 } 324 public void findElementByNameAndClick(String name) { 325 driver.findElement(By.name(name)).click(); 326 } 327 public void findElementByTextAndClick(String text) { 328 driver.findElement(By.linkText(text)).click(); 329 } 330 public void findElementByPartiaTextAndClick(String text) { 331 driver.findElement(By.partialLinkText(text)).click(); 332 } 333 public void findElementByXpathAndClick(String xpath) { 334 driver.findElement(By.xpath(xpath)).click(); 335 } 336 public void findElementByClassNameAndClick(String name) { 337 driver.findElement(By.className(name)).click(); 338 } 339 340 /** 341 * 查找元素并清除文本内容 342 * @param by 传入一个类型 例如:name 343 * @param byValue 传入一个类型值 例如:username 344 */ 345 public boolean findElementClear(String by, String byValue) { 346 try { 347 switch (by) { 348 case "id": 349 driver.findElement(By.id(byValue)).clear(); 350 return true; 351 case "name": 352 driver.findElement(By.name(byValue)).clear(); 353 return true; 354 case "class": 355 driver.findElement(By.className(byValue)).clear(); 356 return true; 357 case "tag": 358 driver.findElement(By.tagName(byValue)).clear(); 359 return true; 360 case "link": 361 driver.findElement(By.linkText(byValue)).clear(); 362 return true; 363 case "partiallinktext": 364 driver.findElement(By.partialLinkText(byValue)).clear(); 365 return true; 366 case "css": 367 driver.findElement(By.cssSelector(byValue)).clear(); 368 return true; 369 case "xpath": 370 driver.findElement(By.xpath(byValue)).clear(); 371 return true; 372 default: 373 throw new RuntimeException("输入的定位类型未在程序中定义,类型为:" + byValue); 374 } 375 } catch (Exception e) { 376 System.out.println("*****没有找到元素,类型为::" + by + "属性值为:" + byValue + " 的元素或者该元素没有输入值****"); 377 return false; 378 } 379 } 380 381 /** 382 * 查找元素并输入值 383 * @param by 传入一个类型 例如:name 384 * @param byValue 传入一个类型值 例如:username 385 * @param key 填写要输入的值 例如:zhangsan 386 */ 387 public boolean findElementSendKeys(String by, String byValue, String key) { 388 try { 389 switch (by) { 390 case "id": 391 driver.findElement(By.id(byValue)).sendKeys(key); 392 return true; 393 case "name": 394 driver.findElement(By.name(byValue)).sendKeys(key); 395 return true; 396 case "class": 397 driver.findElement(By.className(byValue)).sendKeys(key); 398 return true; 399 case "tag": 400 driver.findElement(By.tagName(byValue)).sendKeys(key); 401 return true; 402 case "link": 403 driver.findElement(By.linkText(byValue)).sendKeys(key); 404 return true; 405 case "partiallinktext": 406 driver.findElement(By.partialLinkText(byValue)).sendKeys(key); 407 case "css": 408 driver.findElement(By.cssSelector(byValue)).sendKeys(key); 409 return true; 410 case "xpath": 411 driver.findElement(By.xpath(byValue)).sendKeys(key); 412 return true; 413 default: 414 throw new RuntimeException("输入的定位类型未在程序中定义,类型为:" + byValue); 415 } 416 } catch (Exception e) { 417 System.out.println("*****没有找到元素,类型为::" + by + "属性值为:" + byValue + " 的元素或者该元素无法输入****"); 418 return false; 419 } 420 } 421 /** 422 * 查找元素并输入值 423 * @param by 传入一个类型 例如:name 424 * @param byValue 传入一个类型值 例如:username 425 * @param key 填写要输入的值 例如:zhangsan 426 */ 427 public boolean findElementClearAndSendKeys(String by, String byValue, String key) { 428 try { 429 switch (by) { 430 case "id": 431 findElementClear(by,byValue); 432 driver.findElement(By.id(byValue)).sendKeys(key); 433 return true; 434 case "name": 435 findElementClear(by,byValue); 436 driver.findElement(By.name(byValue)).sendKeys(key); 437 return true; 438 case "class": 439 findElementClear(by,byValue); 440 driver.findElement(By.className(byValue)).sendKeys(key); 441 return true; 442 case "tag": 443 findElementClear(by,byValue); 444 driver.findElement(By.tagName(byValue)).sendKeys(key); 445 return true; 446 case "link": 447 findElementClear(by,byValue); 448 driver.findElement(By.linkText(byValue)).sendKeys(key); 449 return true; 450 case "partiallinktext": 451 findElementClear(by,byValue); 452 driver.findElement(By.partialLinkText(byValue)).sendKeys(key); 453 case "css": 454 findElementClear(by,byValue); 455 driver.findElement(By.cssSelector(byValue)).sendKeys(key); 456 return true; 457 case "xpath": 458 findElementClear(by,byValue); 459 driver.findElement(By.xpath(byValue)).sendKeys(key); 460 return true; 461 default: 462 throw new RuntimeException("输入的定位类型未在程序中定义,类型为:" + byValue); 463 } 464 } catch (Exception e) { 465 System.out.println("*****没有找到元素,类型为::" + by + "属性值为:" + byValue + " 的元素或者该元素无法输入****"); 466 return false; 467 } 468 } 469 470 /** 471 * 定位元素并清空文本内容,输入相应的值 472 */ 473 public void findElementByIdAndClearSendkeys(String id, String text) { 474 driver.findElement(By.id(id)).clear(); 475 driver.findElement(By.id(id)).sendKeys(text); 476 } 477 public void findElementByIdAndClearSendkeys(String id, int num) { 478 driver.findElement(By.id(id)).clear(); 479 driver.findElement(By.id(id)).sendKeys(num + ""); 480 } 481 public void findElementByNameAndClearSendkeys(String name, String text) { 482 driver.findElement(By.name(name)).clear(); 483 driver.findElement(By.name(name)).sendKeys(text); 484 } 485 public void findElementByNameAndClearSendkeys(String name, int num) { 486 driver.findElement(By.name(name)).clear(); 487 driver.findElement(By.name(name)).sendKeys(num + ""); 488 } 489 public void findElementByXpathAndClearSendkeys(String xpath, String text) { 490 findElementByXpath(xpath).clear(); 491 findElementByXpath(xpath).sendKeys(text); 492 } 493 public void findElementByXpathAndClearSendkeys(String xpath, int num) { 494 findElementByXpath(xpath).clear(); 495 findElementByXpath(xpath).sendKeys(num + ""); 496 } 497 public void findElementByClassnameAndClearSendkeys(String classname, String text) { 498 driver.findElement(By.className(classname)).clear(); 499 driver.findElement(By.className(classname)).sendKeys(text); 500 } 501 public void findElementByClassnameAndClearSendkeys(String classname, int num) { 502 driver.findElement(By.className(classname)).clear(); 503 driver.findElement(By.className(classname)).sendKeys(num + ""); 504 } 505 506 /** 507 * 定位元素,并获取其文本内容 508 */ 509 public String getTextByXpath(String xpath) { 510 return findElementByXpath(xpath).getText(); 511 } 512 public String getTextByClassName(String name) { 513 return findElementByClassName(name).getText(); 514 } 515 public String getTextById(String id) { 516 return findElementById(id).getText(); 517 } 518 public String getTextByName(String name) { 519 return findElementByName(name).getText(); 520 } 521 522 /** 523 * 定位元素,并指定点击次数(连续点击) 524 */ 525 public boolean clickById(String id, int clickCount) { 526 try { 527 for (int i = 0; i < clickCount; i++) { 528 driver.findElement(By.id(id)).click(); 529 } 530 return true; 531 } catch (Exception e) { 532 System.out.println(e.getMessage()); 533 return false; 534 } 535 } 536 public boolean clickByXpath(String xpath, int clickCount) { 537 try { 538 for (int i = 0; i < clickCount; i++) { 539 driver.findElement(By.xpath(xpath)).click(); 540 } 541 return true; 542 } catch (Exception e) { 543 System.out.println(e.getMessage()); 544 return false; 545 } 546 } 547 public boolean clickByCss(String css, int clickCount) { 548 try { 549 for (int i = 0; i < clickCount; i++) { 550 driver.findElement(By.cssSelector(css)).click(); 551 } 552 return true; 553 } catch (Exception e) { 554 System.out.println(e.getMessage()); 555 return false; 556 } 557 } 558 559 // 判断元素是否存在 560 public boolean exists(By selector) { 561 driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 设置查询组件等待时间 562 try { 563 driver.findElement(selector); 564 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);// 设置查询组件等待时间 565 return true; 566 } catch (Exception e) { 567 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);// 设置查询组件等待时间 568 return false; 569 } 570 } 571 /** 572 * 判断一个元素是否存在 573 */ 574 public boolean isElementExist(By by) { 575 try { 576 driver.findElement(by); 577 return true; 578 } catch (NoSuchElementException e) { 579 return false; 580 } 581 } 582 583 /** 584 * 判断一组元素是否存在 585 */ 586 public boolean elementsExists(By by) { 587 return (driver.findElements(by).size() > 0) ? true : false; 588 } 589 590 //---------------------------------------判断页面是否包含指定文本--------------------------------------------------------- 591 /** 592 * 1、指定时间内等待直到页面包含文本字符串 593 * @param text 期望出现的文本 594 * @param seconds 超时时间 595 * @return Boolean 检查给定文本是否存在于指定元素中, 超时则捕获抛出异常TimeoutException并返回false 596 * @see org.openqa.selenium.support.ui.ExpectedConditions.textToBePresentInElement(WebElement 597 * element, String text) 598 */ 599 public static Boolean waitUntilPageContainText(String text, long seconds) { 600 try { 601 return new WebDriverWait(driver, seconds) 602 .until(ExpectedConditions.textToBePresentInElement(driver.findElement(By.tagName("body")), text)); 603 } catch (Exception e) { 604 e.printStackTrace(); 605 return false; 606 } 607 } 608 609 /** 610 * 2、默认时间等待直到页面包含文本字符串 611 * @param text 期望出现的文本 612 * @return Boolean 检查给定文本是否存在于指定元素中, 超时则捕获抛出异常TimeoutException并返回false 613 * @see org.openqa.selenium.support.ui.ExpectedConditions.textToBePresentInElement(WebElement 614 * element, String text) 615 */ 616 public static Boolean waitUntilPageContainText(String text) { 617 try { 618 return new WebDriverWait(driver, timeOutInSeconds) 619 .until(ExpectedConditions.textToBePresentInElement(driver.findElement(By.tagName("body")), text)); 620 } catch (Exception e) { 621 e.printStackTrace(); 622 return false; 623 } 624 } 625 626 //---------------------------------------元素判断--------------------------------------------------------- 627 /** 628 * 1、指定时间内等待直到元素存在于页面的DOM上并可见, 可见性意味着该元素不仅被显示, 而且具有大于0的高度和宽度 629 * @param locator 元素定位器 630 * @param seconds 超时时间 631 * @return Boolean 检查给定元素的定位器是否出现, 超时则捕获抛出异常TimeoutException并返回false 632 * @see org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfElementLocated(By 633 * locator) 634 */ 635 public static Boolean waitUntilElementVisible(By locator, int seconds) { 636 try { 637 new WebDriverWait(driver, seconds).until(ExpectedConditions.visibilityOfElementLocated(locator)); 638 return true; 639 } catch (Exception e) { 640 e.printStackTrace(); 641 return false; 642 } 643 } 644 645 /** 646 * 2、默认时间内等待直到元素存在于页面的DOM上并可见, 可见性意味着该元素不仅被显示, 而且具有大于0的高度和宽度 647 * @param locator 元素定位器 648 * @return Boolean 检查给定元素的定位器是否出现, 超时则捕获抛出异常TimeoutException并返回false 649 * @see org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfElementLocated(By 650 * locator) 651 */ 652 public static Boolean waitUntilElementVisible(By locator) { 653 try { 654 new WebDriverWait(driver, timeOutInSeconds).until(ExpectedConditions.visibilityOfElementLocated(locator)); 655 return true; 656 } catch (Exception e) { 657 e.printStackTrace(); 658 return false; 659 } 660 } 661 662 /** 663 * 判断元素是否显示 664 */ 665 public boolean getDisplayStatById(String id) { 666 return driver.findElement(By.id(id)).isDisplayed(); 667 } 668 public boolean getDisplayStatByXpath(String xpath) { 669 return driver.findElement(By.xpath(xpath)).isDisplayed(); 670 } 671 public boolean getDisplayStatByCss(String css) { 672 return driver.findElement(By.cssSelector(css)).isDisplayed(); 673 } 674 /** 675 * 判断元素是否可写 676 */ 677 public boolean getEnableStatById(String id) { 678 return driver.findElement(By.id(id)).isEnabled(); 679 } 680 public boolean getEnableStatByXpath(String xpath) { 681 return driver.findElement(By.xpath(xpath)).isEnabled(); 682 } 683 public boolean getEnableStatByCss(String css) { 684 return driver.findElement(By.cssSelector(css)).isEnabled(); 685 } 686 /** 687 * 判断元素是否选中 688 */ 689 public boolean getSelectStatById(String id) { 690 return driver.findElement(By.id(id)).isSelected(); 691 } 692 public boolean getSelectStatByXpath(String xpath) { 693 return driver.findElement(By.xpath(xpath)).isSelected(); 694 } 695 public boolean getSelectStatByCss(String css) { 696 return driver.findElement(By.cssSelector(css)).isSelected(); 697 } 698 699 /** 700 * 获取当前焦点所在页面元素的属性值(name,value,id,src等等) 701 */ 702 public String getFocusAttributeValue(String attribute) { 703 String value = ""; 704 try { 705 Thread.sleep(333); 706 } catch (Exception e) { 707 e.printStackTrace(); 708 } 709 value = driver.switchTo().activeElement().getAttribute(attribute); 710 System.out.println("The focus Element's " + attribute + "attribute value is>>" + value); 711 return value; 712 } 713 714 // 等待元素可用再点击 715 public void waitForEnabledByXpathAndClick(String xpath) throws InterruptedException { 716 boolean key = true; 717 while (key) { 718 if (findElementByXpath(xpath).isEnabled() && findElementByXpath(xpath).isDisplayed()) { 719 clickByJsByXpath(xpath); 720 key = false; 721 } else { 722 sleep(0); 723 } 724 } 725 } 726 // 自定义等待时间 727 public static void sleep(int key) throws InterruptedException { 728 switch (key) { 729 case 0: 730 Thread.sleep(500); 731 break; 732 case 1: 733 Thread.sleep(2000); 734 break; 735 case 2: 736 Thread.sleep(5000); 737 break; 738 default: 739 System.out.println("错误"); 740 break; 741 } 742 } 743 744 //---------------------------------------下拉列表操作--------------------------------------------------------- 745 // 根据id获取下拉框,根据index选择选项 746 public void findSelectByIdAndSelectByIndex(String id, int index) { 747 Select select = new Select(findElementById(id)); 748 select.selectByIndex(index); 749 } 750 // 根据id获取下拉框,根据value选择选项 751 public void findSelectByIdAndSelectByValue(String id, String value) { 752 Select select = new Select(findElementById(id)); 753 select.selectByValue(value); 754 } 755 // 根据id获取下拉框,根据text选择选项 756 public void findSelectByIdAndSelectByText(String id, String text) { 757 Select select = new Select(findElementById(id)); 758 select.selectByVisibleText(text); 759 } 760 761 // 根据classname获取下拉框,根据text选择选项 762 public void findSelectByClassNameAndSelectByText(String name, String text) { 763 Select select = new Select(findElementByClassName(name)); 764 select.selectByVisibleText(text); 765 } 766 // 根据classname获取下拉框,根据Value选择选项 767 public void findSelectByClassNameAndSelectByValue(String name, String value) { 768 Select select = new Select(findElementByClassName(name)); 769 select.selectByValue(value); 770 } 771 // 根据classname获取下拉框,根据index选择选项 772 public void findSelectByClassNameAndSelectByIndex(String name, int index) { 773 Select select = new Select(findElementByClassName(name)); 774 select.selectByIndex(index); 775 } 776 777 // 根据name获取下拉框,根据text选择选项 778 public void findSelectByNameAndSelectByText(String name, String text) { 779 Select select = new Select(findElementByName(name)); 780 select.selectByVisibleText(text); 781 } 782 // 根据name获取下拉框,根据Value选择选项 783 public void findSelectByNameAndSelectByValue(String name, String value) { 784 Select select = new Select(findElementByName(name)); 785 select.selectByValue(value); 786 } 787 // 根据name获取下拉框,根据index选择选项 788 public void findSelectByNameAndSelectByIndex(String name, int index) { 789 Select select = new Select(findElementByName(name)); 790 select.selectByIndex(index); 791 } 792 793 /** 794 * 定位select并选中对应text的option 795 * @param locator 796 * @param text 797 * @see org.openqa.selenium.support.ui.Select.selectByVisibleText(String text) 798 */ 799 public static void selectByText(By locator, String text) { 800 select = new Select(driver.findElement(locator)); 801 select.selectByVisibleText(text); 802 } 803 804 /** 805 * 定位select并选中对应index的option 806 * @param locator 807 * @param index 808 * @see org.openqa.selenium.support.ui.Select.selectByIndex(int index) 809 */ 810 public static void selectByIndex(By locator, int index) { 811 select = new Select(driver.findElement(locator)); 812 select.selectByIndex(index); 813 } 814 815 /** 816 * 定位select并选中对应value值的option 817 * @param locator 定位select的选择器 818 * @param value option 中的value值 819 * @see org.openqa.selenium.support.ui.Select.selectByValue(String value) 820 */ 821 public static void selectByValue(By locator, String value) { 822 select = new Select(driver.findElement(locator)); 823 select.selectByValue(value); 824 } 825 826 //---------------------------------------弹框操作--------------------------------------------------------- 827 // 判断是否有弹框 828 public boolean isAlertPresent() { 829 try { 830 alert = driver.switchTo().alert(); 831 return true; 832 } catch (NoAlertPresentException Ex) { 833 return false; 834 } 835 } 836 // 接受弹出框 837 public void acceptAlert() { 838 if (this.isAlertPresent()) { 839 alert.accept(); 840 } 841 } 842 // 取消弹出框 843 public void dimissAlert() { 844 if (this.isAlertPresent()) { 845 alert.dismiss(); 846 } 847 } 848 // 获取弹出内容 849 public String getAlertText() { 850 String text = null; 851 if (this.isAlertPresent()) { 852 text = alert.getText(); 853 } else { 854 // todo:log; 855 } 856 return text; 857 } 858 // 弹出对话框输入文本字符串 859 public void inputTextToAlert(String text) { 860 if (this.isAlertPresent()) { 861 alert.sendKeys(text); 862 } else { 863 // todo:log; 864 } 865 } 866 867 //---------------------------------------窗口和iframe--------------------------------------------------------- 868 /** 869 * 切换到当前页面 870 */ 871 public static void switchToCurrentPage() { 872 String handle = driver.getWindowHandle(); 873 for (String tempHandle : driver.getWindowHandles()) { 874 if (tempHandle.equals(handle)) { 875 driver.close(); 876 } else { 877 driver.switchTo().window(tempHandle); 878 } 879 } 880 } 881 /** 882 * 切换到指定title的窗口 883 */ 884 public void switchToWindow(String windowTtitle) { 885 Set<String> windowHandles = driver.getWindowHandles(); 886 for (String handler : windowHandles) { 887 driver.switchTo().window(handler); 888 String title = driver.getTitle(); 889 if (windowTtitle.equals(title)) { 890 break; 891 } 892 } 893 } 894 895 /** 896 * 切换至父级frame 897 * @see org.openqa.selenium.WebDriver.TargetLocator.parentFrame() 898 */ 899 public static void switchToParentFrame() { 900 driver.switchTo().parentFrame(); 901 } 902 903 /** 904 * 切换默认最外层frame或者窗口 905 * @return 这个驱动程序聚焦在顶部窗口/第一个frame上 906 * @see org.openqa.selenium.WebDriver.TargetLocator.defaultContent() 907 */ 908 public static void switchToDefault() { 909 driver.switchTo().defaultContent(); 910 } 911 912 /** 913 * 切换到指定iframe 914 */ 915 public void switchToFrameById(String frameId) { 916 driver.switchTo().frame(frameId); 917 } 918 public void switchToFrameByIndex(int index) { 919 driver.switchTo().frame(index); 920 } 921 public void switchToframeByElement(By locator) { 922 driver.switchTo().frame(driver.findElement(locator)); 923 } 924 925 /** 926 * 提交表单 927 * @see org.openqa.selenium.WebElement.submit() 928 */ 929 public static void submitForm(By locator) { 930 driver.findElement(locator).submit(); 931 } 932 933 /** 934 * 上传文件 935 */ 936 public static void uploadFile(By locator, String filePath) { 937 driver.findElement(locator).sendKeys(filePath); 938 } 939 940 //---------------------------------------JS操作--------------------------------------------------------- 941 // JS点击指定元素 942 public void clickByJs(WebElement element) { 943 ((JavascriptExecutor) driver).executeScript("arguments[0].click()", element); 944 } 945 946 // 定位元素触发JS点击事件 947 public void clickByJsByXpath(String xpath) { 948 clickByJs(driver.findElement(By.xpath(xpath))); 949 } 950 public void clickByJsByText(String text) { 951 clickByJs(findElementByText(text)); 952 } 953 public void clickByJsById(String id) { 954 clickByJs(findElementById(id)); 955 } 956 public void clickByJsByClassName(String name) { 957 clickByJs(findElementByClassName(name)); 958 } 959 public void clickByJsByName(String name) { 960 clickByJs(findElementByName(name)); 961 } 962 963 // 滚动到窗口最上方 964 public void scrollToTop() { 965 ((JavascriptExecutor) driver).executeScript("window.scrollTo(0,0);"); 966 } 967 // 滚动到页面底部 968 public void scrollToBottom(String id) { 969 ((JavascriptExecutor) driver).executeScript("window.scrollTo(0,10000);"); 970 } 971 // 滚动到某个元素 972 public void scrollToElement(WebElement element) { 973 JavascriptExecutor js = (JavascriptExecutor) driver; 974 js.executeScript("arguments[0].scrollIntoView(true);", element); 975 } 976 // js给指定元素value赋值 977 public void inputTextByJs(String text, WebElement element) { 978 JavascriptExecutor js = (JavascriptExecutor) driver; 979 js.executeScript("arguments[0].value=" + text + "\"", element); 980 } 981 // js使元素隐藏元素显示 982 public void makeElementDisplay(WebElement element) { 983 JavascriptExecutor js = (JavascriptExecutor) driver; 984 js.executeScript("arguments[0].style=arguments[1]", element, "display: block;"); 985 } 986 987 988 //---------------------------------------浏览器操作--------------------------------------------------------- 989 /** 990 * 关闭当前浏览器 991 */ 992 public static void closeCurrentBrowser() { 993 driver.close(); 994 } 995 /** 996 * 关闭所有selenium驱动打开的浏览器 997 */ 998 public static void closeAllBrowser() { 999 driver.quit(); 1000 } 1001 /** 1002 * 最大化浏览器 1003 */ 1004 public static void maxBrowser() { 1005 driver.manage().window().maximize(); 1006 } 1007 1008 /** 1009 * 自定义设置浏览器尺寸 1010 */ 1011 public static void setBrowserSize(int width, int heigth) { 1012 driver.manage().window().setSize(new Dimension(width, heigth)); 1013 } 1014 1015 /** 1016 * 获取网页的title值 1017 */ 1018 public String getTitle() { 1019 return driver.getTitle(); 1020 } 1021 1022 /** 1023 * 获取当前url字符串 1024 */ 1025 public static String getURL() { 1026 return driver.getCurrentUrl(); 1027 } 1028 1029 /** 1030 * 上一个页面(点击浏览器返回) 1031 */ 1032 public static void returnToPreviousPage() { 1033 driver.navigate().back(); 1034 } 1035 1036 /** 1037 * 下一个页面(如果没有下一个页面则什么都不做) 1038 * 浏览器上的前进 1039 */ 1040 public static void forwardToNextPage() { 1041 driver.navigate().forward(); 1042 } 1043 1044 /** 1045 * 刷新页面 1046 */ 1047 public static void refreshPage() { 1048 driver.navigate().refresh(); 1049 } 1050 1051 // 强制刷新页面 1052 public void refresh() { 1053 Actions ctrl = new Actions(driver); 1054 ctrl.keyDown(Keys.CONTROL).perform(); 1055 try { 1056 pressKeyEvent(KeyEvent.VK_F5); 1057 } catch (AWTException e) { 1058 e.printStackTrace(); 1059 } 1060 ctrl.keyUp(Keys.CONTROL).perform(); 1061 } 1062 1063 /** 1064 * 判断是否加载有JQuery 1065 */ 1066 public Boolean JQueryLoaded() { 1067 Boolean loaded; 1068 JavascriptExecutor js = (JavascriptExecutor) driver; 1069 try { 1070 loaded = (Boolean) js.executeScript("return" + "JQuery()!=null"); 1071 } catch (WebDriverException e) { 1072 loaded = false; 1073 } 1074 return loaded; 1075 } 1076 //---------------------------------------屏幕截图--------------------------------------------------------- 1077 public void screenShot(WebDriver driver) { 1078 String dir_name = "screenshot"; 1079 if (!(new File(dir_name).isDirectory())) { 1080 new File(dir_name).mkdir(); 1081 } 1082 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss"); 1083 String time = sdf.format(new Date()); 1084 try { 1085 File source_file = (((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE));// 执行截屏 1086 FileUtils.copyFile(source_file, new File(dir_name + File.separator + time + ".png")); 1087 } catch (IOException e) { 1088 e.printStackTrace(); 1089 } 1090 } 1091 // 截图命名为当前时间保存桌面 1092 public void takeScreenshotByNow() throws IOException { 1093 File srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); 1094 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss"); 1095 String time = sdf.format(new Date()); 1096 String file = "C:\\Users\\zhangsan\\Desktop\\picture\\" + time + ".png"; 1097 FileUtils.copyFile(srcFile, new File(file)); 1098 } 1099 // 截图重命名保存至桌面 1100 public void takeScreenshotByName(String name) throws IOException { 1101 File srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); 1102 String file = "C:\\Users\\zhangsan\\Desktop\\picture\\" + name + ".png"; 1103 FileUtils.copyFile(srcFile, new File(file)); 1104 } 1105 1106 //---------------------------------------键盘操作--------------------------------------------------------- 1107 // 获取键盘 1108 public Keyboard getKeyboard() { 1109 return ((HasInputDevices) driver).getKeyboard(); 1110 } 1111 // 模拟crtrl+F5 1112 public void refreshWithCtrlF5() { 1113 getKeyboard().sendKeys(Keys.CONTROL, Keys.F5); 1114 } 1115 /** 1116 * 按物理按键(KeyEvent类中查找相关的常量) 1117 * 例子: 1118 * Robot robot = new Robot(); 1119 * robot.keyPress(KeyEvent.VK_ENTER);//按下enter键 1120 */ 1121 public void pressKeyEvent(int keycode) throws AWTException { 1122 Robot robot = new Robot(); 1123 robot.keyPress(keycode); 1124 } 1125 1126 //---------------------------------------鼠标操作--------------------------------------------------------- 1127 // 鼠标悬浮指定元素并点击 1128 public void moveToElementById(String id) { 1129 Actions actions = new Actions(driver); 1130 actions.moveToElement(findElementById(id)).perform(); 1131 } 1132 public void moveToElementByClassName(String name) { 1133 Actions actions = new Actions(driver); 1134 actions.moveToElement(findElementByClassName(name)).perform(); 1135 } 1136 1137 // 鼠标右键点击 1138 public void RightClickWebElement(String id) { 1139 Actions actions = new Actions(driver); 1140 actions.contextClick(findElementById(id)).perform(); 1141 } 1142 // 鼠标双击 1143 public void DoubleClickWebElement(String id) { 1144 Actions actions = new Actions(driver); 1145 actions.doubleClick(findElementById(id)).perform(); 1146 } 1147 1148 /** 1149 * 模拟点击键盘上的键: 1150 * keyDown()按下 1151 * keyUp()抬起,松开 1152 * 1153 * 常见的键: 1154 * Keys.SHIFT Keys.ALT Keys.Tab 1155 */ 1156 public void ClickCtrl(String id) { 1157 Actions actions = new Actions(driver); 1158 actions.keyDown(Keys.CONTROL);//按下control键 1159 actions.keyUp(Keys.CONTROL);//松开control键 1160 } 1161 1162 /** 1163 * 模拟键盘输入关键字到输入框 1164 */ 1165 public void sendText(By by,String text) { 1166 Actions actions = new Actions(driver); 1167 actions.sendKeys(driver.findElement(by),text).perform(); 1168 } 1169 1170 /** 1171 * 模拟鼠标移动到指定元素,并点击 1172 */ 1173 public void moveToElementAndClick(By by,String text) { 1174 Actions actions = new Actions(driver); 1175 actions.moveToElement(driver.findElement(by)).click().perform(); 1176 } 1177 1178 /** 1179 * 模拟鼠标点击和释放 1180 */ 1181 public void clickHoldAndRelease(By by) { 1182 Actions actions = new Actions(driver); 1183 actions.clickAndHold(driver.findElement(by)).perform(); 1184 try { 1185 Thread.sleep(1000); 1186 } catch (InterruptedException e) { 1187 e.printStackTrace(); 1188 } 1189 actions.release(driver.findElement(by)).perform(); 1190 } 1191 1192 //---------------------------------------Cookie操作--------------------------------------------------------- 1193 /** 1194 * 获取当前域所有的cookies 1195 * @return Set<Cookie> 当前的cookies集合 1196 * @see org.openqa.selenium.WebDriver.Options.getCookies() 1197 */ 1198 public static Set<Cookie> getAllCookies() { 1199 return driver.manage().getCookies(); 1200 } 1201 // 输出cookies信息 1202 public void outputCookie() { 1203 Set<Cookie> cookie = driver.manage().getCookies(); 1204 System.out.println(cookie); 1205 } 1206 //添加cookie信息 1207 public void addCookie(Map<String, String> args) { 1208 Set<String> keys = args.keySet(); 1209 for (String key : keys) { 1210 driver.manage().addCookie(new Cookie(key, args.get(key))); 1211 } 1212 } 1213 /** 1214 * 用给定的name和value创建默认路径的Cookie并添加, 永久有效 1215 * @param name 1216 * @param value 1217 * @see org.openqa.selenium.WebDriver.Options.addCookie(Cookie cookie) 1218 * @see org.openqa.selenium.Cookie.Cookie(String name, String value) 1219 */ 1220 public static void addCookie(String name, String value) { 1221 driver.manage().addCookie(new Cookie(name, value)); 1222 } 1223 1224 /** 1225 * 用给定的name和value创建指定路径的Cookie并添加, 永久有效 1226 * @param name cookie名称 1227 * @param value cookie值 1228 * @param path cookie路径 1229 */ 1230 public static void addCookie(String name, String value, String path) { 1231 driver.manage().addCookie(new Cookie(name, value, path)); 1232 } 1233 /** 1234 * 根据cookie名称删除cookie 1235 * @param name cookie的name值 1236 * @see org.openqa.selenium.WebDriver.Options.deleteCookieNamed(String name) 1237 */ 1238 public static void deleteCookie(String name) { 1239 driver.manage().deleteCookieNamed(name); 1240 } 1241 /** 1242 * 删除当前域的所有Cookie 1243 * @see org.openqa.selenium.WebDriver.Options.deleteAllCookies() 1244 */ 1245 public static void deleteAllCookies() { 1246 driver.manage().deleteAllCookies(); 1247 } 1248 1249 /** 1250 * 根据名称获取指定cookie 1251 * @param name cookie名称 1252 * @return Map<String, String>, 如果没有cookie则返回空, 返回的Map的key值如下: 1253 * <ul> 1254 * <li><tt>name</tt> <tt>cookie名称</tt> 1255 * <li><tt>value</tt> <tt>cookie值</tt> 1256 * <li><tt>path</tt> <tt>cookie路径</tt> 1257 * <li><tt>domain</tt> <tt>cookie域</tt> 1258 * <li><tt>expiry</tt> <tt>cookie有效期</tt> 1259 * </ul> 1260 * @see org.openqa.selenium.WebDriver.Options.getCookieNamed(String name) 1261 */ 1262 public static Map<String, String> getCookieByName(String name) { 1263 Cookie cookie = driver.manage().getCookieNamed(name); 1264 if (cookie != null) { 1265 Map<String, String> map = new HashMap<String, String>(); 1266 map.put("name", cookie.getName()); 1267 map.put("value", cookie.getValue()); 1268 map.put("path", cookie.getPath()); 1269 map.put("domain", cookie.getDomain()); 1270 map.put("expiry", cookie.getExpiry().toString()); 1271 return map; 1272 } 1273 return null; 1274 } 1275 1276 //---------------------------------------远程--------------------------------------------------------- 1277 /** 1278 * 进入测试,打开浏览器,输入网址,打开网页 1279 * 1280 * @param remoteUrl 远程服务器地址 1281 * @param pageUrl 测试页面地址 1282 */ 1283 public boolean startTest(String remoteUrl, String pageUrl) { 1284 try { 1285 try { 1286 driver = new RemoteWebDriver(new URL(remoteUrl), DesiredCapabilities.firefox()); 1287 } catch (MalformedURLException e) { 1288 e.printStackTrace(); 1289 } 1290 driver.get(pageUrl); 1291 return true; 1292 } catch (Exception e) { 1293 e.printStackTrace(); 1294 System.out.println(e.getMessage()); 1295 return false; 1296 } 1297 } 1298 1299 /** 1300 * 进入测试,打开浏览器,输入网址,打开网页 1301 * @param explore 调用的浏览器,需要启动不同的server 1302 * 如:firefox,需要运行selenium-server-standalone-2.33.0.jar。 1303 * IE,则需运行IEDriverServer.exe 1304 * @param remoteUrl 远程服务器地址 1305 * @param pageUrl 测试页面地址 1306 */ 1307 public boolean startTest(String explore, String remoteUrl, String pageUrl) { 1308 try { 1309 try { 1310 if ("f".equals(explore)) { 1311 System.out.println("firefox"); 1312 driver = new RemoteWebDriver(new URL(remoteUrl), DesiredCapabilities.firefox()); 1313 } else if ("ie".equals(explore)) { 1314 System.out.println("internet explorer"); 1315 DesiredCapabilities cap = DesiredCapabilities.internetExplorer(); 1316 driver = new RemoteWebDriver(new URL(remoteUrl), cap); 1317 } else { 1318 System.out.println("firefox"); 1319 driver = new RemoteWebDriver(new URL(remoteUrl), DesiredCapabilities.firefox()); 1320 } 1321 } catch (Exception e) { 1322 e.printStackTrace(); 1323 } 1324 driver.get(pageUrl); 1325 return true; 1326 } catch (Exception e) { 1327 System.out.println(e.getMessage()); 1328 return false; 1329 } 1330 } 1331 }