09_常用的方法

**帮助文档:**https://www.javadoc.io/doc/org.seleniumhq.selenium/selenium-api/2.50.1/org/openqa/selenium/WebDriver.html

1.浏览器导航

driver.navigate().back();//在浏览器历史记录中向后导航
driver.navigate().forward();//在浏览器历史记录中向前导航
driver.navigate().refresh();//刷新/重新加载网页

2.切换窗口

driver.switchTo().window("window_name");//切换到制定的window_name页面
driver.switchTo().alert();//切换到alert弹窗
driver.switchTo().activeElement();//定位到当前聚焦的元素上
driver.switchTo().defaultContent();//切换到最上层页面
driver.switchTo().frame("frame_reference");//通过id、name、element(定位的某个元素)、索引来切换到某个frame

举例:

driver.switchTo().frame(0);
driver.switchTo().frame(driver.findElement(By.tagName("iframe")));
driver.switchTo().frame(driver.findElement(By.xpath("//iframe[contains(@id,'x-URS-iframe')]")));
document.getElementsByTagName("iframe”)//获取页面上所有的iframe
driver.switchTo().parentFrame();//这是switch_to中独有的方法,可以切换到上一层的frame,对于层层嵌套的frame很有用

frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。

示例完整代码:

package package1;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class IframeDemo {
    public static void main(String[] args) throws InterruptedException {
        //加载驱动
        System.setProperty("webdriver.chrome.driver","C:\\software\\chromedriver_win32\\chromedriver.exe");

        //加载浏览器路径(如果不是默认安装路径)
        System.setProperty("webdriver.chrome.bin","C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");

        //驱动实例化
        WebDriver driver = new ChromeDriver();

        //打开QQ邮箱登录网站
        driver.get("https://mail.qq.com/");

        //定位并切换到iframe
        driver.switchTo().frame(driver.findElement(By.id("login_frame")));
        Thread.sleep(1000);

        //定位邮箱地址输入框
        driver.findElement(By.id("u")).sendKeys("1096721729");
        Thread.sleep(2000);

        //定位密码输入框
        driver.findElement(By.id("p")).sendKeys("123456");
        Thread.sleep(2000);

        //退出浏览器
        driver.quit();
    }
}

3.滚动网页

方法一:固定滑动多少像素

//向下滚动网页1500像素
JavascriptExecutor js1 = (JavascriptExecutor)driver;
js1.executeScript("scrollBy(0, 1500)");

方法二:滑动到某个元素的位置

    //执行JS方法(这样视图就会自动滑动到elenext的位置) 将页面拉到底部
WebElement elenext= driver.findElement(By.xpath("//a[contains(@href,'page') and @class='n']"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", elenext);

arguments对象是所有函数中都可用的局部变量,可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:arguments[0],arguments[1],arguments[2]

//将页面滑到顶部
/*
scrollIntoView是一个与页面(容器)滚动相关的API
element.scrollIntoView() 参数默认为true
参数为true:调用该函数,页面发送滚动,使element的顶部与视图(容器)顶部对齐
参数为false:使element的底部与视图(容器)底部对齐
*/
WebElement elemore= driver.findElement(By.xpath("//a[contains(@href,'more') and contains(@class,'s-tab-more')]"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(false);", elemore);

方法三:Window.scrollTo()

/* 
scrollTo() 方法可把内容滚动到指定的坐标
scrollTo(xpos,ypos)
参数描述:
    xpos 必需。要在窗口文档显示区左上角显示的文档的 x 坐标。
    ypos 必需。要在窗口文档显示区左上角显示的文档的 y 坐标。
*/
((JavascriptExecutor) driver).executeScript("window.scrollTo(0,document.body.scrollHeight));//滚动到页面最底部
((JavascriptExecutor) driver).executeScript("window.scrollTo(document.body.scrollHeight,0));//滚动到页面最顶部

4.等待时间

//设置等待页面完全加载的时间是10秒,如果在10秒内加载完毕,剩余时间不再等待
driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

//隐式等待
//识别元素时的超时时间,总共等待10秒, 如果10秒后,元素还不存在,就会抛出异常  org.openqa.selenium.NoSuchElementException
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

//显式等待,页面元素是否在页面上可用和可被单击
wait.until(ExpectedConditions.elementToBeClickable(By.className("n")));

//显式等待,页面元素在页面中存在
wait.until(ExpectedConditions.presenceOfElementLocated(By.className("n")));

//等待3秒
Thread.sleep(3000);

//异步脚本的超时时间
driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS);

wait.until(ExpectedConditions.textToBePresentInElementValue(By.id("kw"),"Java"));//判断输入框中是否存在指定的文本
wait.until(ExpectedConditions.textToBePresentInElement(driver.findElement(By.className("nums_text")),"百度为您找到相关结果约"));//判断元素中是否存在指定的文本
wait.until(ExpectedConditions.attributeContains(By.name("tj_login"),"href","passport.baidu.com"));//判断元素的属性值是否包含指定的文本
//等待指定的iframe可用的时候切换到它,等待时间20s
new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[contains(@id,'x-URS-iframe')]")));

5.窗口最大最小化

//使窗口最大化
driver.manage().window().maximize();
//使窗口最小化
driver.manage().window().minimize();//java没有这种方法

6.截屏

需要用到文件操作工具类(FileUtils)需要用到commons-io

//截屏操作
//截图到output
File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
try {
    String savePath = "/Users/dengchunmei/test/example.jpg";
    //String savePath = "D:\\example.jpg";
    //复制内容到指定文件中
    FileUtils.copyFile(scrFile, new File(savePath));
} catch (IOException e) {
    e.printStackTrace();
}

7.js定位

String search_js = "document.getElementsByName('wd')[0].value='selenium';";
String search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';";
String button_js = "document.getElementById('su').click();";
String button_js2 = "document.getElementsByClassName('s_btn')[0].click()";
String button_js3 = "document.getElementsByClassName('bg’)[2].click();
String button_js4 = "document.getElementsByClassName(‘bg s_btn’)[0].click()";
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript(search_js2);
js.executeScript(button_js2);

获取元素的属性值:

String test = "return document.getElementById('su').getAttribute('value')";
String test1 = "return document.getElementById('su').className";
JavascriptExecutor js = (JavascriptExecutor)driver;
System.out.println("value is => " + js.executeScript(test1));

document.querySelectorAll('input[autocomplete]')——-包含“autocomplete”的<input>标签
document.querySelectorAll('#kw')---id为“kw”的元素
document.querySelectorAll('.s_ipt')---所有class为“s_ipt”的元素
document.querySelectorAll("input")-所有<input>标签
document.querySelectorAll("span > input")---所有父元素为<span><input>元素
document.querySelectorAll("input,span")—所有<input><span>标签
document.querySelectorAll("input.s_ipt”)-所有class为“s_ipt”的<input>元素
    document.querySelectorAll("input[id='kw'])—所有id属性值为kw的input标签
    document.querySelectorAll("a[class*=c-color-t])---所有class属性值包含c-color-t的a标签
    document.querySelectorAll("a[class='mnav c-font-normal c-color-t'])---所有class属性值为指定值的a标签
    document.querySelectorAll("a.mnav.c-font-normal.c-color-t”)--所有class属性值为指定值的a标签
    document.querySelectorAll("a.mnav, a.c-color-t”)—所有class为mnav或者c-color-t的a标签
    jQuery中文网 http://www.jquerycn.cn/course/jquery-sel-multipleattribute-equal-value.html
    document.querySelectorAll("a[class*='c-color-t'][href*='news']) —查找所有class包含c-color-t并且href包含news的a标签
    document.querySelectorAll("div[id='u']>a[name*='tj_'][class*='l']")—查找id为u的div下的name包含tj_且class包含l的a标签
    document.querySelectorAll("div[id='u']>a:nth-child(3))—查找id为u的div下的第三个a标签
    document.querySelectorAll("div[id='wrapper']>div:nth-of-type(3) div[class='search_tool'])—查找id为wrapper的div下的第三个div里面的class为search_tool的div元素

8.jquery定位

String search_jq = "$('.s_ipt').val('淘宝');//class
String button_jq = "$('#su')[0].click();//id
((JavascriptExecutor) driver).executeScript(search_jq);
((JavascriptExecutor) driver).executeScript(button_jq);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春暖花开dcm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值