Selenium Web 自动化 - Selenium常用API

左手的ㄟ右手 2022-12-05 12:18 418阅读 0赞

1 对浏览器操作

1.1 用webdriver打开一个浏览器

  1. //打开firefox浏览器:
  2. WebDriver driver = new FirefoxDriver();
  3. //打开IE浏览器
  4. WebDriver driver = new InternetExplorerDriver ();
  5. //打开HtmlUnit浏览器
  6. WebDriverdriver = new HtmlUnitDriver();
  7. //打开chrome浏览器
  8. WebDriverdriver = new ChromeDriver();

1.2 最大化浏览器&关闭浏览器

  1. WebDriver driver = new FirefoxDriver();
  2. driver.manage().window().maximize();
  3. driver.close();
  4. driver.quit();

1.3 设置浏览器窗口大小

  1. private static void SetWindowTest(WebDriver driver)
  2. throws InterruptedException {
  3. // 设置窗口的 宽度为:800,高度为600
  4. Dimension d = new Dimension(800, 600);
  5. driver.manage().window().setSize(d);
  6. Thread.sleep(2000);
  7. // 设置窗口最大化
  8. driver.manage().window().maximize();
  9. Thread.sleep(2000);
  10. // 设置窗口出现在屏幕上的坐标
  11. Point p = new Point(500, 300);
  12. // 执行设置
  13. driver.manage().window().setPosition(p);
  14. Thread.sleep(2000);
  15. }

1.4 打开测试页面

  1. 打开测试页面
  2. driver.get("http://www.baidu.com/");
  3. driver.navigate().to("http://www.baidu.com/");
  4. //navigate方法会产生1个Navigator对象,其封装了与导航相关的一些方法,比如前进后退等

1.5 处理浏览器弹出的新窗口

  1. private static void MutiWindowTest(WebDriver driver)
  2. throws InterruptedException {
  3. WebDriver newWindow = null ;
  4. driver.get("http://www.hao123.com/");
  5. //浏览器最大化
  6. driver.manage().window().maximize();
  7. //获取当前页面句柄
  8. String current_handles = driver.getWindowHandle();
  9. //点击 百度链接
  10. driver.findElement(By.xpath("//*[@data-title='百度']")).click();
  11. //接下来会有新的窗口打开,获取所有窗口句柄
  12. Set<String> all_handles = driver.getWindowHandles();
  13. //循环判断,把当前句柄从所有句柄中移除,剩下的就是你想要的新窗口
  14. Iterator<String> it = all_handles.iterator();
  15. while(it.hasNext()){
  16. if(current_handles == it.next()) continue;
  17. //跳入新窗口,并获得新窗口的driver - newWindow
  18. newWindow = driver.switchTo().window(it.next());
  19. }
  20. //接下来在新页面进行操作,也就是百度首页,我们输入一个java关键字进行搜索
  21. Thread.sleep(5000);
  22. WebElement baidu_keyowrd = newWindow.findElement(By.id("kw"));
  23. baidu_keyowrd.sendKeys("java");
  24. Thread.sleep(1000);
  25. //关闭当前窗口,主要使用close而不是quite,
  26. newWindow.close();
  27. driver.switchTo().window(current_handles);
  28. System.out.println(driver.getCurrentUrl());
  29. }

2 页面元素定位

Webdriver提供下面两种方法来定位页面元素,参数是By对像,最常用是By.id和By.name查找。

  • findElement   定位某个元素,如果没有找到元素会抛出异常:NoSuchElementException
  • findElements 定位一组元素

例如需要定位如下元素:

  1.  <input class="input_class" type="text" name="passwd" id="passwd-id" />
  2. //By.id
  3. WebElement element = driver.findElement(By.id("passwd-id"));
  4. //By.name
  5. WebElement element = driver.findElement(By.name("passwd"));
  6. //By.xpath
  7. WebElement element =driver.findElement(By.xpath("//input[@id='passwd-id']"));
  8. //By.className
  9. WebElement element = driver.findElement(By.className("input_class"));
  10. //By.cssSelector
  11. WebElement element = driver.findElement(By.cssSelector(".input_class"));
  12. //By.linkText
  13. //通俗点就是精确查询
  14. WebDriver driver = new FirefoxDriver();
  15. driver.get("http://www.baidu.com/");
  16. WebElement element = driver.findElement(By.linkText("百科"));
  17. //By.partialLinkText:
  18. //这个方法就是模糊查询
  19. WebDriver driver = new FirefoxDriver();
  20. driver.get("http://www.baidu.com/");
  21. WebElement element = driver.findElement(By.partialLinkText("hao"));
  22. //By.tagName
  23. WebDriver driver = new FirefoxDriver();
  24. driver.get("http://www.baidu.com/");
  25. String test= driver.findElement(By.tagName("form")).getAttribute("name");
  26. System.out.println(test);

3 如何对页面元素进行操作

3.1 WebElement相关方法

在这里插入图片描述
3.2 iFrame的处理

  1. driver.switchTo().frame(“city_set_ifr”); //传入的是iframe的ID
  2. dr.switchTo().defaultContent(); //如果要返回到以前的默认content

3.3 输入框(text field or textarea)

  1. WebElement element = driver.findElement(By.id("passwd-id"));
  2. element.sendKeys(“test”);//在输入框中输入内容:
  3. element.clear();     //将输入框清空
  4. element.getText();   //获取输入框的文本内容:

3.4 下拉选择框(Select)

  1. Select select = new Select(driver.findElement(By.id("select")));
  2. select.selectByVisibleText(“A”);
  3. select.selectByValue(“1”);
  4. select.deselectAll();
  5. select.deselectByValue(“1”);
  6. select.deselectByVisibleText(“A”);
  7. select.getAllSelectedOptions();
  8. select.getFirstSelectedOption();

示例:

  1. package seleniumAPIDemo;
  2. import org.openqa.selenium.By;
  3. import org.openqa.selenium.WebDriver;
  4. import org.openqa.selenium.firefox.FirefoxDriver;
  5. import org.openqa.selenium.support.ui.Select;
  6. public class SelectDemo {
  7. public static void main(String[] args) throws InterruptedException {
  8. WebDriver driver = new FirefoxDriver();
  9. iframeAndSelectTest(driver);
  10. driver.quit();
  11. }
  12. private static void iframeAndSelectTest(WebDriver driver)
  13. throws InterruptedException {
  14. driver.get("http://www.2345.com/");
  15. //浏览器最大化
  16. driver.manage().window().maximize();
  17. //点击切换按钮
  18. driver.findElement(By.id("J_city_switch")).click();
  19. //进入天气城市选择iframe
  20. driver.switchTo().frame("city_set_ifr");
  21. Thread.sleep(2000);
  22. //然后在进行选择城市
  23. //定位 省下拉框
  24. Select province = new Select(driver.findElement(By.id("province")));
  25. province.selectByValue("20");
  26. Thread.sleep(2000);
  27. //定位 城市下拉框
  28. Select city = new Select(driver.findElement(By.id("chengs")));
  29. city.selectByIndex(0);
  30. Thread.sleep(2000);
  31. //定位区
  32. Select region = new Select(driver.findElement(By.id("cityqx")));
  33. region.selectByVisibleText("X 新密");
  34. Thread.sleep(2000);
  35. //点击定制按钮
  36. driver.findElement(By.id("buttonsdm")).click();
  37. Thread.sleep(2000);
  38. //返回默认的content
  39. driver.switchTo().defaultContent();
  40. }
  41. }

3.5 单选项(Radio Button)

  1. WebElement radio=driver.findElement(By.id("BookMode"));
  2. radio.click();     //选择某个单选项
  3. radio.clear();     //清空某个单选项
  4. radio.isSelected();  //判断某个单选项是否已经被选择

3.6 多选项(checkbox)

  1. WebElement checkbox = driver.findElement(By.id("myCheckbox."));
  2. checkbox.click();
  3. checkbox.clear();
  4. checkbox.isSelected();
  5. checkbox.isEnabled();

3.7 按钮(button)

  1. WebElement btn= driver.findElement(By.id("save"));
  2. btn.click();      //点击按钮
  3. btn.isEnabled ();  //判断按钮是否enable

3.8 处理Alert
弹出对话框(Popup dialogs)

  1. Alert alert = driver.switchTo().alert();
  2. alert.accept();  //确定
  3. alert.dismiss();  //取消
  4. alert.getText(); //获取文本

示例:

  1. private static void alertTest(WebDriver driver) throws InterruptedException {
  2. driver.get("http://www.w3school.com.cn/tiy/t.asp?f=hdom_alert");
  3. //浏览器最大化
  4. driver.manage().window().maximize();
  5. //进入frame
  6. driver.switchTo().frame("i");
  7. //找到按钮并点击按钮
  8. driver.findElement(By.xpath("//*[@value='显示消息框']")).click();
  9. Thread.sleep(2000);
  10. //获取Alert
  11. Alert a = driver.switchTo().alert();
  12. //打印出文本内容
  13. System.out.println(a.getText());
  14. //点击确定
  15. Thread.sleep(2000);
  16. a.accept();
  17. // 如果alert上有取消按钮,可以使用a.dismiss()代码
  18. }

3.9 上传文件
3.9.1 元素标签是Input时上传方式
Upload.html文件内容如下:

  1. <body>
  2. <input type="file" id="fileControl" value="选择文件"/>
  3. </body>

代码如下:

  1. private static void uploadTest1(WebDriver driver) throws InterruptedException {
  2. //打开上传的网页 - get中输入upload的地址
  3. driver.get("D:\\DownLoad\\UploadTest\\upload.html");
  4. WebElement e1 = driver.findElement(By.id("fileControl"));
  5. Thread.sleep(2000);
  6. //输入要上传文件的地址
  7. e1.sendKeys("D:\\DownLoad\\UploadTest\\被上传的文件.txt");
  8. Thread.sleep(2000);
  9. }

3.9.2 通过操作桌面浏览窗口上传

3.10 Selenium处理HTML5
3.10.1 处理Vedio
这就需要了解html5中vedio的相关方法了,可以参考http://www.w3school.com.cn/tags/html\_ref\_audio\_video\_dom.asp

  1. private static void html5VedioTest(WebDriver driver)
  2. throws InterruptedException {
  3. driver.get("http://videojs.com/");
  4. Thread.sleep(2000);
  5. //找到vedio元素
  6. WebElement vedio = driver.findElement(By.id("preview-player_html5_api"));
  7. //声明js执行器
  8. JavascriptExecutor js = (JavascriptExecutor) driver;
  9. //对vedio这个元素执行播放操作
  10. js.executeScript("arguments[0].play()", vedio);
  11. //为了观察效果暂停5秒
  12. Thread.sleep(5000);
  13. //对vedio这个元素执行暂停操作
  14. js.executeScript("arguments[0].pause()", vedio);
  15. //为了观察效果暂停2秒
  16. Thread.sleep(2000);
  17. //对vedio这个元素执行播放操作
  18. js.executeScript("arguments[0].play()", vedio);
  19. //为了观察效果暂停2秒
  20. Thread.sleep(2000);
  21. //对vedio这个元素执行重新加载视频的操作
  22. js.executeScript("arguments[0].load()", vedio);
  23. //为了观察效果暂停2秒
  24. Thread.sleep(2000);
  25. }

3.10.2 处理Canvas

  1. private static void Html5CanvasTest(WebDriver driver)
  2. throws InterruptedException {
  3. driver.get("http://literallycanvas.com/");
  4. Thread.sleep(2000);
  5. //找到canvas元素
  6. WebElement canvas = driver.findElement(By.xpath("//*[@id='literally-canvas']//canvas[1]"));
  7. //声明一个操作类
  8. Actions drawPen = new Actions(driver);
  9. //点击并保持不放鼠标 ,按照给定的坐标点移动
  10. drawPen.clickAndHold(canvas).moveByOffset(20, 100).moveByOffset(100, 20).moveByOffset(-20, -100).moveByOffset(-100, -20).release().perform();
  11. Thread.sleep(2000);
  12. }

3.11 表单(Form)

  1. //Form中的元素的操作和其它的元素操作一样,对元素操作完成后对表单的提交可以:
  2. WebElement approve = driver.findElement(By.id("approve"));
  3. approve.click();
  4. //或
  5. approve.submit();//只适合于表单的提交

4 其他

4.1 等待元素加载
超时设置

  1. WebDriver driver = new FirefoxDriver();
  2. driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);     //识别元素时的超时时间
  3. driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);  //页面加载时的超时时间
  4. driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);  //异步脚本的超时时间
  • 硬性等待 Thread.sleep(int sleeptime);
  • 智能等待
  • 设置等待页面加载完毕

    private static void waitElementTest(WebDriver driver) {

    1. //设置等待页面完全加载的时间是10秒,如果在10秒内加载完毕,剩余时间不在等待
    2. driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
    3. driver.get("https://www.baidu.com/");
    4. By inputBox = By.id("kw");
    5. By searchButton = By.id("su");
    6. //智能等待元素加载出来
    7. intelligentWait(driver, 10, inputBox);
    8. //智能等待元素加载出来
    9. intelligentWait(driver, 10, searchButton);
    10. //输入内容
    11. driver.findElement(inputBox).sendKeys("JAVA");
    12. //点击查询
    13. driver.findElement(searchButton).click();
    14. }
  1. public static void intelligentWait(WebDriver driver,int timeOut, final By by){
  2. try {
  3. (new WebDriverWait(driver, timeOut)).until(new ExpectedCondition<Boolean>() {
  4. public Boolean apply(WebDriver driver) {
  5. WebElement element = driver.findElement(by);
  6. return element.isDisplayed();
  7. }
  8. });
  9. } catch (TimeoutException e) {
  10. Assert.fail("超时!! " + timeOut + " 秒之后还没找到元素 [" + by + "]",e);
  11. }
  12. }

4.2 执行JS脚本

有时候我们需要JS脚本来辅助我们进行测试,比如我们用JS赋值或者用js执行点击操作等。执行JS脚本比较适用某些元素不易点击的情况下使用,比如网页内容太长,当前窗口太长,想要点击那些不在当前窗口可以看到元素可以用此方法。

  1. private static void runJSTest1(WebDriver driver) throws InterruptedException {
  2. String js ="alert(\"hello,this is a alert!\")";
  3. ((org.openqa.selenium.JavascriptExecutor) driver).executeScript(js);
  4. Thread.sleep(2000);
  5. }
  6. private static void runJSTest2(WebDriver driver)
  7. throws InterruptedException {
  8. driver.get("https://www.baidu.com/");
  9. String js ="arguments[0].click();";
  10. driver.findElement(By.id("kw")).sendKeys("JAVA");
  11. WebElement searchButton = driver.findElement(By.id("su"));
  12. ((org.openqa.selenium.JavascriptExecutor) driver).executeScript(js,searchButton);
  13. Thread.sleep(2000);
  14. }

4.3 模拟键盘操作
有时候有些元素不便点击或者做其他的操作,这个时候可以借助selenium提供的Actions类,它可以模拟鼠标和键盘的一些操作,比如点击鼠标右键,左键,移动鼠标等操作。对于这些操作,使用perform()方法进行执行。

  1. private static void actionsTest(WebDriver driver)
  2. throws InterruptedException {
  3. // 设置等待页面完全加载的时间是10秒,如果在10秒内加载完毕,剩余时间不在等待
  4. driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
  5. driver.get("https://www.baidu.com/");
  6. By inputBox = By.id("kw");
  7. By searchButton = By.id("su");
  8. // 智能等待元素加载出来
  9. intelligentWait(driver, 10, inputBox);
  10. // 智能等待元素加载出来
  11. intelligentWait(driver, 10, searchButton);
  12. // 实例化action对象
  13. Actions action = new Actions(driver);
  14. // 通过action模拟键盘输入java关键字到 输入框,只有使用了perform方法才会输入进去
  15. action.sendKeys(driver.findElement(searchButton), "java").perform();
  16. // 鼠标模拟移动到搜索按钮
  17. action.moveToElement(driver.findElement(searchButton)).perform();
  18. // 模拟点击操作
  19. action.click().perform();
  20. Thread.sleep(2000);
  21. }

在这里插入图片描述

上面是我收集的一些视频资源,在这个过程中帮到了我很多。如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入我们群【902061117】,里面有各种软件测试资源和技术讨论。
在这里插入图片描述

当然还有面试,面试一般分为技术面和hr面,形式的话很少有群面,少部分企业可能会有一个交叉面,不过总的来说,技术面基本就是考察你的专业技术水平的,hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求,一般来讲,技术的话只要通过了技术面hr面基本上是没有问题(也有少数企业hr面会刷很多人)
我们主要来说技术面,技术面的话主要是考察专业技术知识和水平,上面也是我整理好的精选面试题。
加油吧,测试人!如果你需要提升规划,那就行动吧,在路上总比在起点观望的要好。事必有法,然后有成。
资源不错就给个推荐吧~

发表评论

表情:
评论列表 (有 0 条评论,418人围观)

还没有评论,来说两句吧...

相关阅读