Selenium常用API及常用等待方式介绍

WebElement常用API

  • click()

    触发当前元素的点击事件

    写法:

    driver.findElement(By.id("su")).click(); // 点击百度一下
    

  • clear()

    清空内容

    写法:

    driver.findElement(By.id("kw")).clear(); // 清除百度输入框中的内容
    

  • sedKeys(……)

    1、往文本框一类元素中写入内容

    element.sendKeys("百度"); //输入内容”百度”
    

    写法:

    driver.findElement(By.id("kw")).sendKeys("百度");
    

    2、按键操作

    element.sendKeys(Keys.CONTROL,"a");//ctrl+a 全选
    element.sendKeys(Keys.CONTROL,"x");//ctrl+x 剪切
    element.sendKeys(Keys.CONTROL,"c");//ctrl+c 复制
    element.sendKeys(Keys.CONTROL,"v");//ctrl+v 粘贴
    element.sendKeys(Keys.ENTER);//回车
    element.sendKeys(Keys.BACK_SPACE);//删除
    element.sendKeys(Keys.SPACE);//空格键
    

    Demo:

        @Test
        public void testDemo() throws InterruptedException {
            WebDriver driver = new ChromeDriver();
            driver.get("https://www.baidu.com");
            driver.findElement(By.id("kw")).clear();
            driver.findElement(By.id("kw")).sendKeys("百度");
            Thread.sleep(2000);
            // 全选中百度,然后复制
            driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL, "a");
            driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL, "c");
            // 复制粘贴,粘贴两次方便演示
            for (int i=0; i<2; i++){
                driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL, "v");
            }
            // 回车
            driver.findElement(By.id("kw")).sendKeys(Keys.ENTER);
            driver.quit();
        }
    

  • getTagName()

    获取元素的标签名

    写法:

    String su = driver.findElement(By.id("su")).getTagName();
    System.out.println("The tagName of element is " + su);
    

  • getAttribute(属性名)

    根据属性名获取元素属性值

    写法:

    String attribute = driver.findElement(By.id("su")).getAttribute("value");
    System.out.println("The attribute of element is " + attribute);
    

  • getText()

    获取当前元素的文本值

    写法:

    String text = driver.findElement(By.cssSelector("#hotsearch-refresh-btn > span")).getText();
    System.out.println("The text of element is " + text);
    


WebDriver常用API

  • get(String url)

    访问指定url页面

    driver.get(String url);
    

    写法:

    driver.get("https://www.baidu.com");
    

  • getCurrentUrl()
    获取当前页面的url地址

    driver.getCurrentUrl();
    

    写法:

    String currentUrl = driver.getCurrentUrl();
    System.out.println("currentUrl: " + currentUrl);
    

  • getTitle()
    获取当前页面的标题

    driver.getTitle();
    

    写法:

    String title = driver.getTitle();
    System.out.println("title: " + title);
    

  • getPageSource()
    获取当前页面源代码

    driver.getPageSource();
    

    写法:

    String pageSource = driver.getPageSource();
    System.out.println("pageSource: " + pageSource);
    

  • quit()
    关闭驱动对象以及所有相关的窗口

    driver.quit();
    

  • close()
    关闭当前窗口

    driver.close();
    

    Demo:

        @Test
        public void testDemo throws InterruptedException {
            WebDriver driver = new ChromeDriver();
            driver.get("https://www.baidu.com");
            WebDriverWait wait = new WebDriverWait(driver, 10);
            // 点击新闻
            wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#s-top-left > a:first-child"))).click();
            Thread.sleep(3000);
            // 关闭当前窗口
            driver.close();
            // 退出会话,关闭浏览器
            driver.quit();
        }
    

  • navigate对象 -- 导航栏
    关于浏览器的基本功能操作,大部分都是由navigate对象提供的,如完成浏览器回退或者导航到指定url页
    面等操作

    //获取navigate对象
    Navigation navigation = driver.navigate();
    //访问指定的url地址
    navigation.to(url);
    //刷新当前页面
    navigation.refresh();
    //浏览器回退操作
    navigation.back();
    //浏览器前进操作
    navigation.forward();
    

    Demo:

        @Test
        public void testDemo() throws InterruptedException {
            WebDriver driver = new ChromeDriver();
            //获取navigate对象
            Navigation navigation = driver.navigate();
            // 打开百度地址
            navigation.to("https://www.baidu.com");
            // 搜索百度
            driver.findElement(By.cssSelector("#kw")).sendKeys("百度");
            driver.findElement(By.id("kw")).sendKeys(Keys.ENTER);
            Thread.sleep(3000);
            //刷新当前页面
            navigation.refresh();
            Thread.sleep(3000);
            //浏览器回退操作
            navigation.back();
            Thread.sleep(3000);
            //浏览器前进操作
            navigation.forward();
            Thread.sleep(3000);
            // 退出会话,关闭浏览器
            driver.quit();
        }
    

  • window基本操作
    关于窗口的设置,基本都是由window对象提供的

    //获取window对象
    Window window = driver.manage().window();
    //窗口最大化
    window.maximize();
    //浏览器全屏
    window.fullscreen();
    //窗口位置
    window.getPosition();
    //窗口大小
    window.getSize();
    //设置位置
    window.setPosition(targetPosition);
    //设置窗口大小
    window.setSize(targetSize);
    

    Demo:

        @Test
        public void testDemo(){
            WebDriver driver = new ChromeDriver();
            driver.get("https://www.baidu.com");
            Window window = driver.manage().window();
            // 最大化
            window.maximize();
            // 浏览器全屏
            window.fullscreen();
    
            // 窗口位置
            Point position = window.getPosition();
            System.out.println("获取的窗口位置是: " + position);
            System.out.println("x轴的位置:" + position.getX());
            System.out.println("y轴的位置:" + position.getY());
            // 获取窗口大小
            Dimension size = window.getSize();
            System.out.println("获取的窗口大小为: " + size);
            System.out.println("窗口的宽度:" + size.getWidth());
            System.out.println("窗口的高度:" + size.getHeight());
    
            // 移动窗口位置
            position.move(108, 44);
            System.out.println("移动后,获取的窗口位置是: " + position);
            System.out.println("移动后,x轴的位置:" + position.getX());
            System.out.println("移动后,y轴的位置:" + position.getY());
            // 修改窗口大小(分辨率)
            window.setSize(new Dimension(1000, 800));
            Dimension size1 = window.getSize();
            System.out.println("修改后,获取的窗口大小为: " + size1);
            System.out.println("窗口的宽度:" + size1.getWidth());
            System.out.println("窗口的高度:" + size1.getHeight());
    		
          	// 退出会话,关闭浏览器
            driver.quit();
        }
    

等待方式介绍

1、强制等待

Thread.sleep(long millis);

优点:使用简单
缺点:容易造成时间浪费


2、隐式等待

在设置的超时时间范围内不断查找元素,直到找到元素或者超时为止

注:不要混合隐式和显式等待。这样做会导致不可预测的等待时间。例如,设置 10 秒的隐式等待和 15 秒的显式等待可能会导致 20 秒后发生超时

如:设置等待时间为5秒,在第3秒找到元素,不再继续等待
设置方式

driver.manage.timeouts().implicitlyWait(long time, TimeUnit unit);

优点:相对灵活
缺点:

  • 设置是针对全局的,在WebDriver实例整个生命周期有效,但并不是所有的元素都需要等待
  • 只能等待元素存在,不能适用条件更复杂的情况,如:元素可点击、元素可见

3、显示等待

显式等待通常是我们自定义的一段代码,用来等待某个条件发生后再继续执行后续代码(如元素存在、元素
可点击、元素可见等)

使用方式:

WebDriverWait wait = new WebDriverWait();
WebElement element = wait.until(expectCondition)

优点:
每隔一段时间扫描一次页面,检查元素是否满足等待结果条件,比如查找元素,则检查元素是否存在,不存
在则继续等待,直到找到或超时。
该方式不是全局设置,因此特定需要等待的元素可以这样处理,推荐优先使用这一种方法。

方法 等待条件
presenceOfElementLocated 页面元素在页面中存在
visibilityOfElementLocated 页面元素在页面存在并且可见
elementToBeClickable 页面元素是否在页面上可被单击

4、流畅等待

FluentWait的定义

简单来说,FluentWait就是一个普通的类,我们使用这个类能支持一直等待直到特定的条件出现。

1)是一个类而且是包org.openqa.selenium.support.ui的一部分

2)是Wait接口的一种实现

3)每个Fluent wait,我们可以设置等待最大时间,而且可以做设置等待的频率去检查一些特定的条件。

// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
  .withTimeout(Duration.ofSeconds(30))
  .pollingEvery(Duration.ofSeconds(5))
  .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
  public WebElement apply(WebDriver driver) {
    return driver.findElement(By.id("foo"));
  }
});

优点:

FluentWait 实例可以定义等待条件的最长时间,以及检查条件的频率。用户可以将等待配置为在等待时忽略特定类型的异常,例如NoSuchElementException在页面上搜索元素时。

FluentWait 和 显示等待的区别:简单来说就是显示等待里有一些设定好了的前置条件的等待方式,而Fluent wait你可以设置自己的方法去处理各种等待的问题。

posted @ 2022-04-14 04:25  boge_blogs  阅读(101)  评论(0编辑  收藏  举报