zoukankan      html  css  js  c++  java
  • Selenium系列之--03 常见元素操作总结

    一、Selenium总共有八种定位方法 

    1.  By.id()  通过id定位
    2.  By.name()  通过name 定位
    3.  By.xpath() 通过xpath定位
    4.  By.className() 通过className定位
    5.  By.cssSelector() 通过CSS 定位
    6.  By.linkText() 通过linkText
    7.  By.tagName() 通过tagName
    8.  By.partialLinkText() 通过匹到的部分linkText

    目前,使用比较多的是cssSelector和xpath,

    cssSelector有一些高级用法,熟练后可以方便地定位元素,如^用于匹配一个前缀,$用于匹配一个后缀,*用于匹配任意字符。例如:

    a. 匹配一个有id属性,并且id属性是以”id_prefix_”开头的超链接元素:a[id^='id_prefix_']

    b. 匹配一个有id属性,并且id属性是以”_id_sufix”结尾的超链接元素:a[id$='_id_sufix']

    c. 匹配一个有id属性,并且id属性中包含”id_pattern”字符的超链接元素:a[id*='id_pattern']

    最后总结:
    
    //1. 当页面元素有id属性时,最好尽量用id来定位。
    
    //2. xpath很强悍,但定位性能不是很好,所以尽量少用。如果确实少数元素不好定位,可以选择xpath或cssSelector。
    
    //3. 当要定位一组元素相同元素时,可以考虑用tagName(HTML 标记名称)或name。
    
    //4. 当有链接需要定位时,可以考虑linkText或partialLinkText方式。
    NoSuchElementFoundException
    findElement()和findElements()方法在找不到相应的元素时,就会抛出NoSuchElementFoundException异常

    二、常用浏览器操作

    // 1.浏览器中加载URL: get() --首先要启动浏览器
    driver.get("https://www.baidu.com");
    driver.navigate().to("http://www.baidu.com/"); 
    //navigate方法会产生1个Navigator对象,其封装了与导航相关的一些方法,比如前进后退等
    // 2.浏览器最大化: window().maximize() driver.manage().window().maximize();    // 3.刷新:refresh() driver.navigate().refresh(); // 4.截图:getScreenshotAs() File screenfile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(screenfile,new File("D:/12306.png")); // 5.获取当前页的URL:getCurrentUrl() String url = driver.getCurrentUrl(); System.out.println(url); // 6.获取当前页的title:getTitle() String title = driver.getTitle(); System.out.println(title);

    三、常见页面元素操作总结

    1. 文本框(input)

    WebElement.sendKeys()    //元素赋值
    WebElement.clear()       //清空
    WebElement.getAttribute("value");    //获取元素的属性值(一组元素中非常实用)
    WebElemetn.getText()    //获取输入框文本内容

    注:对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过sendKeys()指定本地文件路径的方式实现文件上传

    2. 单选按钮,多选按钮

    WebElement.click();
    WebElement.isSelected();    //判断元素是否被选中
    WebElement.isEnabled();
    WebElement.isDisplayed();   //判断元素是否显示

    3. 下拉选 select

    WebElement.selectByIndex(int index) 通过index,从0开始
    WebElement.selectByVisibleText(String text) 通过匹配到的可见字符,是显示在下拉框的值
    WebElement.selectByValue(String value) 通过匹配到标签里的value 
    //不选择对应的选择项:
    select.deselectAll();
    select.deselectByValue(“name”);
    select.deselectByVisibleText(“姓名”);
    //或者获取选择项的值:
    select.getAllSelectedOptions();
    select.getFirstSelectedOption();

    详见:参考链接

    4. 提示框Alert

    细分三种,Alert,prompt,confirm

    driver.switchTo().alert(); 获取alert
    
    Alert(driver).accept() # 等同于点击“确认”或“OK”
    Alert(driver).dismiss() # 等同于点击“取消”或“Cancel”
    Alert(driver).authenticate(username,password) # 验证,针对需要身份验证的alert,目前还没有找到特别合适的示例页面
    Alert(driver).send_keys(keysToSend) # 发送文本,对有提交需求的prompt框(上图3)
    Alert(driver).text # 获取alert文本内容,对有信息显示的alert框

    详见:参考链接

    5. 超链接

    超链接比较常见,一般都是标签a

    WebElement.click();

    如果是chrome浏览器打开超链接时,点超链接的同时按下Ctrl会打开新标签,按下shift会打开新窗口

    6. 表单

    提交方法:submit解释:查找到表单(from)直接调用submit即可

    实例:driver.find_element_by_id("form1").submit()

    切换方法:driver.switchTo().frame(xf)

    解释:在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用, WebDriver 只能在一个页面上对元素识别与 定位, 对于 frame/iframe 表单内嵌页面上的元素无法直接定位。 这时就需要切换

    dr.switchTo().frame("framename or id");
    //frame直接跟id和名称均可

    WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe")); driver.switchTo().frame(xf); //-------跳出表单 driver.switchTo().defaultContent();

    7. 窗口

    //获取窗口的方法:
    1. driver.getWindowHandle(); 返回的是字符串,获取当前窗口的句柄
    2. driver.getWindowHandles(); 返回的是 Set<String> ,获取所有窗口
    //窗口切换
    driver.switchTo().window(window);

    8. 浏览器的cookies

    有时候我们需要验证浏览器中Cookie是否正确, 因为基于真实Cookie的测试是无法通过白盒测试和集成测试进行的。

    getCookies()                   //获得所有 cookie 信息。
    getCookieNamed(String name)    //返回字典的key为“name”的Cookie信息。
    addCookie(cookie dict)         //添加Cookie。“cookie_dict”指字典对象,必须有 name和value值。
    deleteCookieNamed(String name) //删除Cookie 信息。 “name”是要删除的 cookie的名称; “optionsString” 是该Cookie的选项,目前支持的选项包括“路径” , “域” 。
    deleteAllCookies()             //删除所有 cookie 信息。

    9. 隐式等待

    • implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。
    • setScriptTimeout。异步脚本的超时时间。WebDriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。
    • pageLoadTimeout。页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么WebDriver就会抛出异常。
    //页面加载超时时间设置为 5s
    driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
    driver.get("https://www.baidu.com/");
    
    //定位对象时给 10s 的时间, 如果 10s 内还定位不到则抛出异常
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.findElement(By.id("kw")).sendKeys("selenium");
    
    //异步脚本的超时时间设置成 3s
    driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);

    10. 执行JavaScript代码

    使用selenium做自动化测试,有时需要执行一些JavaScript代码。在selenium中有Javascript类可以执行。 
    import org.openqa.selenium.JavascriptExecutor; 
    其中有两个方法我们会经常遇到。 
    executeScript、executeAsyncScript

    method详情
    executeScript 同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕;
    executeAsyncScript 异步方法,它不会阻塞主线程执行。

    a. 初始化driver

    通过向下转型 JavascriptExecutor jse = (JavascriptExecutor) driver; 将driver转为JavascriptExector对象

    然后再调用executeScript()方法来执行JS

    JavascriptExecutor jse = (JavascriptExecutor)driver;  

    b. 直接传入Javascript代码

    可以直接给jse传入javascript代码:

    jse.executeScript("window.document.getElementById('username').click()";  

    c. 传入WebElement执行JS

    //执行点击事件
    JavascriptExecutor jse = (JavascriptExecutor) driver;
    WebElement element = driver.findElement(By.id("jingshou")); jse.executeScript("arguments[0].click();", element); //元素赋值 jse.executeScript("arguments[0].value="北京"", from_inpox); //设置元素属性--- 指定的DIV新增(修改)了 style {height: 1000px}的属性 WebElement div = driver.findElemnt(By.id("myDiv")); jse.executeScript("arguments[0].setAttribute('style', arguments[1])", div, "height: 1000px");

    d. 滚动到指定位置小技巧

    如何滚动到定位的元素,使用java script

    // scroll to mylink
    JavascriptExecutor scroll = (JavascriptExecutor) driver;
    scroll.executeScript("arguments[0].scrollIntoView();", myLink);
    
    // roll down and keep the element to the center of browser
    JavascriptExecutor scroll = (JavascriptExecutor)driver;
    scroll.executeScript("arguments[0].scrollIntoViewIfNeeded(true);", download);
    <!-- window.scrollTo(左边距,上边距); --> scroll.executeScript("window.scrollTo(100,450);"); //x为水平移动的像素、y为垂直移动像素、location为元素位置 //操作滚动条 1. 垂直滚动 String scroll = "document.documentElement.scrollTop=" + "y"; JavascriptExecutor jse=(JavascriptExecutor) driver; jse.executeScript(scroll); 2. 水平滚动 String scroll = "document.documentElement.scrollLeft=" + "x"; jse.executeScript(scroll); 3. 滚动条式 String scroll = "document.getElementById("location").scrollLeft=x"; jse.executeScript(scroll);

    四、其他定位方式

    1. JS的5种定位方式

    有时候会出现一些诡异的定位失效或者定位到了点击失效的问题,这个时候如果用js进行直接执行该事件,往往就可以解决那些诡异的事情~

    id定位:    document.getElementById()
    name定位:   document.getElementsByName()
    tag定位:    document.getElementsByTagName()
    class定位:    document.getElementsByClassName()
    css定位:    document.querySelectorAll()

    其中只有id对象用的是Element返回是单个对象,其他都是Elements返回的是一个list,下面的栗子:

    search_js = "document.getElementsByName('wd')[0].value='selenium';"
    search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';"
    button_js = "document.getElementById('su').click();"
    button_js2 = "document.getElementsByClassName('s_btn')[0].click()"
    driver.execute_script(search_js2)
    driver.execute_script(button_js2)

    2. 超神的jQuery定位

  • 相关阅读:
    hash
    C#执行Sql事务处理
    数据库的锁表
    页面的刷新 和图片的替换
    单点登录 Webservice
    js 动态调用js文件
    .net生成EXCEL
    JS : 连续滚动
    引用指定类型的对象
    对象序列化为字符串
  • 原文地址:https://www.cnblogs.com/liuyitan/p/8250321.html
Copyright © 2011-2022 走看看