selenium(2)----JAVA版本

Selenium

上面是selenium的官方网站,学习任何API的用法都可以进行点击搜索按钮

在线工具 - 你的工具箱 (tool.lu)

1)如何打印页面标题和当前页面的url 

public void TestBaiDu11(){
        //1.获取文章标题
        String title=driver.getTitle();
        System.out.println(title);
        //2.打印当前页面的url
        String url=driver.getCurrentUrl();
        System.out.println(url);
    }

2)点击百度首页上面的这些新闻超链接,并将跳转后的新页面的url和title打印出来

1)点击了超链接之后我们打开了新的标签页,加上原来的百度首页一共就有两个标签页了,但是此时对于selenium来说是不知道当前展示的页面是什么,仍然还在定位第一个界面中的元素,所以此时就无法正确的定位到元素了

2)selenium对每一个标签页都给了唯一的一个标识,但是selenium并不能直接跳转到我们所期望的一个页面,称之为句柄,每一个页面都有唯一的句柄,代表页面的唯一身份标识

        driver.get("要测试的网页");
        driver.navigate().refresh();//刷新页面

3)窗口

1)获取当前页面的句柄:通过driver.getWindowHandle()来获取

 public void TestBaiDu11(){
    String curWindow1=driver.getWindowHandle();
    System.out.println("页面跳转前的句柄是"+curWindow1);
    driver.findElement(By.linkText("新闻")).click();
    driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    String curWindow2=driver.getWindowHandle();
    System.out.println("页面跳转之后的句柄是"+curWindow2);
    }

由此可以看出在页面跳转之前和新标签页面打开之后,页面的句柄是没有发生任何变化的

2)获取到所有页面的句柄:通过driver.getWindowHandles()来进行获取,最终的返回值是Set<String>

 public void TestBaiDu11(){
      driver.findElement(By.linkText("新闻")).click();
    //页面显式等待
      driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    //获取到当前页面的所有页面句柄
       Set<String> allwindows=driver.getWindowHandles();
     for(String window:allwindows){
         System.out.println(window);
     }

3)那么我们如何切换到最新的页面呢?转换到最新的页面句柄呢

在这里面通过的是driver.switch().window(字符串类型(是操作页面句柄))

这个字符串是从所有的操作句柄中取出来的

就可以成功把selenium定位到新的标签页

 public void TestBaiDu11(){
        //1.进行跳转到新闻页面
        driver.findElement(By.linkText("新闻")).click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        //2.在进行获取到当前所有页面的句柄
        LinkedHashSet<String> resultHandlers= (LinkedHashSet<String>) driver.getWindowHandles();
        List<String> handlers=new ArrayList<>();
        //3.将其转化成一个字符串数组
        for(String window:resultHandlers){
            handlers.add(window);
        }
        //4.将句柄转移到最新的页面
        driver.switchTo().window(handlers.get(1));
        //5.获取到当前页面的url和title
        String title=driver.getTitle();
        String url=driver.getCurrentUrl();
        System.out.println("当前页面的title是"+title+"\n"+"当前页面的url是"+url);
    }

这个时候这样的想法,直接写一个for循环,当i等于集合的长度的时候再进行跳转,但是Set集合是没有顺序的

4)窗口大小的设置

1)driver.manage().window().maximize();直接让窗口最大化
2)driver.manage().window().minimize();直接让窗口最小化
3)Dimension dimension=new Dimension(height,width);设置窗口的宽度和高度
driver.manage().window().setSize(dimension);

5)窗面的移动

window.scroll(0,document.body.scrollTop)JS脚本滑动到最顶端

window.scroll(0,document.body.scrollHeight)JS脚本滑动到最底端

selenium不可以直接编译JS语言,但是仍然可以使用函数方法来执行JS脚本

driver.executeScript("JS的语言的字符串");

6)导航:在selenium里面通过navigate()接口来实现页面的导航

前进:driver.navigate().forward()

后退:driver.navigate().back()

下面是点击一个网站之后,到了一个页面,在一个页面里面进行前进和回退操作

 //点击网址演示前进和回退操作
    public void Test_Other1() throws InterruptedException {
        ChromeDriver driver=new ChromeDriver();
        driver.get("http://tool.lu/");
        Thread.sleep(1000);
        driver.findElement(By.cssSelector("#page > div:nth-child(1) > div.tabs-wrap > ul > li:nth-child(2) > a")).click();
        Thread.sleep(1000);
        driver.navigate().back();
    }

7)选中弹窗

1)正常情况下是可以在前端代码里面定位到普通的弹窗的,就是可以使用driver.findElement()方法来定位到元素的

 //点开本地的html文件
    public void Test_Other2() throws InterruptedException {
        driver.get("file:///D:/selenium2html/modal.html");
        driver.findElement(By.cssSelector("#show_modal")).click();
        Thread.sleep(1000);
        driver.findElement(By.cssSelector("#click")).click();
        Thread.sleep(1000);
        driver.findElement(By.cssSelector("#myModal > div.modal-footer > button:nth-child(1)")).click();
    }

2)但是有一些警告弹窗是不可以在前端代码中定位到元素的,必须使用Selenium提供的Alert窗口来进行处理

当前页面点击链接弹出来的alert框是不能通过findElement的方式来继续宁定位到这个Alert框的

Alert alert=driver.switchTo().alert();

1)alert.accept()确认按钮

2)alert.dismiss()点击取消按钮

3)alert.sendKeys()向弹出的Alert框里面输入文字

4)alert.getText()获取到Alert框中的汉字

 public void Test_Other3() throws InterruptedException{
   driver.get("file:///D:/selenium2html/alert.html");
   driver.findElement(By.cssSelector("#tooltip")).click();
   Thread.sleep(1000);
   //因为我们此时不能通过findElement来定位到这个弹窗,所以只能通过定位alert框的方式来进行定位到这个弹出框,成功切换到alert弹窗上面
   Alert alert=driver.switchTo().alert();
   //取消弹窗
   alert.dismiss();
    }

3)Alert框里面要进行数据输入,提示弹窗

1)这种情况就是说先进行点击页面上面的唯一一个按钮

2)再从弹出的Alert框里面输入汉字

3)最后点击确定,最后在页面上显示我们所输入的汉字

此事时无法通过driver.findElement()来确定到这个alert框,更别说向里面输入文字了

 public void Test_Other4() throws InterruptedException{
        driver.get("file:///D:/selenium2html/send.html");
        //1.先进行点击页面上面的唯一一个按钮
        driver.findElement(By.cssSelector("body > input[type=button]")).click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        //2.选中上面的alert框
        Alert alert=driver.switchTo().alert();
        alert.sendKeys("张三");
        //3.获取alert框中的文字
        String message=alert.getText();
        System.out.println(message);
        //4.点击确定
        alert.accept();
    }

8)模拟鼠标和键盘的操作:selenium提供了Action接口

1)模拟鼠标选中元素操作:clickAndHold().perform()方法

 Actions actions=new Actions(driver)

 1)actions.clickAndHold(WebElement).perform()模拟鼠标选中元素

1)模拟鼠标移动到想要的元素上并且鼠标悬停

 Actions actions=new Actions(driver);

 actions.clickAndHold(WebElement).perform()进行演示

2)进行点击元素

actions.clickAndHold(WebElement).click()进行鼠标左键点击所选中的元素

public void Test_Other5() throws InterruptedException{
        driver.get("file:///D:/selenium2html/level_locate.html");
        //1.确认点击页面上的唯一一个元素link1元素
        driver.findElement(By.cssSelector("body > div:nth-child(2) > div > div > a")).click();
        Thread.sleep(1000);
        //2.鼠标右击
        Actions actions=new Actions(driver);
        actions.clickAndHold(driver.findElement(By.cssSelector("#dropdown1 > li:nth-child(2) > a"))).perform();
        Thread.sleep(2000);
    }

2)模拟鼠标点击左击,但是不松手:actions.clickAndHold(WebElement).click()

3)模拟鼠标右击:actions.contextClick().perform();

4)模拟鼠标双击:actions.doubleClick().perform();

5)模拟鼠标悬停到固定元素上面:action.moveToElement().perform();

模拟场景:

1)先进行打开百度页面,进行双击两下百度搜索的按钮

2)鼠标右击新闻

3)鼠标悬停于视频标签

 public void Test_Other8() throws InterruptedException{
        //1.进行打开百度首页
        driver.get("http://www.baidu.com");
        //2.进行鼠标双击两下百度搜索
        Actions actions=new Actions(driver);
        WebElement element1=driver.findElement(By.cssSelector("#su"));
        actions.doubleClick(element1).perform();
        //3.进行鼠标右击
        Thread.sleep(3000);
        WebElement element2=driver.findElement(By.linkText("新闻"));
        actions.contextClick(element2).perform();
        Thread.sleep(3000);
        //4.进行鼠标悬停
        WebElement element3=driver.findElement(By.linkText("地图"));
        actions.moveToElement(element3).perform();
        Thread.sleep(3000);

    }

6)模拟鼠标拖拽:dragAndDrop(source, target).perform();

7)模拟键盘操作sendKeys()

1)使用ctrl+v,ctrl+c,ctrl+a,ctrl+z

1.1)先进行获取WebElement对象

1.2)调用对象的sendKeys()方法

1.3)sendKeys()里面的方法的参数是一个String类型

1.4)Keys.chord(),第一个参数是Keys.CONTROL,第二个参数是"a";

public void Test_Other6() throws InterruptedException{
        driver.get("http://www.baidu.com");
        //1.先进行选中页面的输入框
        WebElement element=driver.findElement(By.cssSelector("#kw"));
        //2.再继续进行输入文字
        element.sendKeys("生命在于运行");
        //3.进行使用ctrl+a
        element.sendKeys(Keys.chord(Keys.CONTROL,"a"));
        //4.暂停时间并且再次使用快捷键
        Thread.sleep(3000);
        element.sendKeys(Keys.chord(Keys.CONTROL,"x"));
    }

2)使用ENTER回车来实现登录:通过WebElement对象的send_Keys(),参数是Keys.ENTER

 public void Test_Other7() throws InterruptedException{
        //1.进行打开禅道的官网
        String url="http://127.0.0.1:88/zentao/user-login-L3plbnRhby8=.html";
        driver.get(url);
        //2.进行输入用户名和密码
        driver.findElement(By.cssSelector("#account")).sendKeys("admin");
        driver.findElement(By.cssSelector("#loginPanel > div > div.col-8 > form > table > tbody > tr:nth-child(2) > td > input")).sendKeys("12503487eA!");
        Thread.sleep(3000);
        //3.使用Enter键模拟登录
        driver.findElement(By.cssSelector("#loginPanel > div > div.col-8 > form > table > tbody > tr:nth-child(2) > td > input")).sendKeys(Keys.ENTER);
    }

3)模拟TAB键:driver.findElement(WebElement).sendKeys(Keys.TAB)

9)模拟下拉框选择

1)直接进行通过driver.findElement()方法来定位元素

 public void Test_Other10() throws InterruptedException{
        //1.打开页面
        driver.get("file:///C:/selenium2html/drop_down.html");
        //2.选中要进行点击的元素
        driver.findElement(By.cssSelector("#ShippingMethod > option:nth-child(5)")).click();
        //3.进行休眠
        Thread.sleep(3000);
    }

2)通过selenium官方提供的Select类来进行定位元素

 public void Test_Other11() throws InterruptedException {
        //1.打开页面
        driver.get("file:///C:/selenium2html/drop_down.html");
        //2.进行选中select标签
        WebElement element=driver.findElement(By.cssSelector("#ShippingMethod"));
        Select select=new Select(element);
        //3.在继续进行选中select标签中的option标签
        select.selectByIndex(5);
        Thread.sleep(3000);
        select.selectByValue("10.69");
        Thread.sleep(3000);
        select.deselectByVisibleText("");
    }

1)先进行选中select标签,也就是所有option标签的父亲元素,相当于是父亲,返回一个WebElement对象

2)创建Select对象,构造方法里面传入WebElement对象

3)进行选中元素

3.1)通过select.selectByIndex(索引位置),这是第一种方法通过索引来定位选项,索引是从0开始计数

3.2)通过select.selectByValue("value属性对应的值")来定位option元素

通过value属性来选择

3.3)通过select.deselectByVisibleText("标签夹着的文本名字")来定位option元素

10)文件的上传

页面中点击文件上传会弹出来系统窗口,但是selenium不能够操作系统窗口,也不能打开文件路径,我们在selenium中可以使用sendKeys()方法来进行输入我们想要上传的文件路径+文件名字,就能够达到文件上传的结果;

  public void Test_SendFile() throws InterruptedException{
        //1.打开元素界面
        driver.get("file:///C:/selenium2html/upload.html");
        //2.定位页面中的上传按钮
        driver.findElement(By.cssSelector("body > div > div > input[type=file]")).sendKeys("D:/Java.png");
    }

 11)选中页面上面的所有的checkbox标签,而不进行点击对应的radio标签

 public void Test_SendCheckBox() throws InterruptedException{
        //1.先打开元素界面
        driver.get("C:\\selenium2html\\checkbox.html");
        //2.选中所有的input类型的元素
        List<WebElement> inputs=driver.findElements(By.tagName("input"));
        //3.进行遍历这个集合,如果发现元素的type属性是checkbox,那么直接进行点击,如果发现value属性是radio,那么直接跳过
        for(WebElement webElement:inputs){
            if(webElement.getAttribute("type").equals("checkbox")){
                webElement.click();
            }
        }
    }

 

屏幕截图:代码的执行速度比页面的渲染的速度要快

举个例子:百度搜索关键词并验证结果页,并直接进行截图

1)File file=driver.getScreenshotAs(Output.File);

2)在将文件通过inputStream和OutputStream写入到指定的目录即可

 public void Test_File() throws InterruptedException, IOException {
        //1.打开百度页面
        driver.get("http://www.baidu.com");
        //2.进行百度搜索
        driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
        driver.findElement(By.cssSelector("#su")).click();
        //3.进行屏幕截图并创建IDEA的指定目录
        File file=driver.getScreenshotAs(OutputType.FILE);
        FileReader reader=new FileReader(file);
        File father=new File("./Images/");
        if(!father.isFile()){
            father.mkdirs();
        }
        //4.读文件与写文件
        System.out.println(file.getName());
        InputStream inputStream=new FileInputStream(file);
        String resultUrl=father.getCanonicalPath()+"\\"+"zhangsan"+".png";
        System.out.println(resultUrl);
        OutputStream outputStream=new FileOutputStream(resultUrl);
        while(true){
            int ch=inputStream.read();
            if(ch==-1){
                break;
            }
            outputStream.write((char)(ch));
        }

    }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值