一、环境搭配
1、maven导入jar包依赖
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.0.0-alpha-7</version>
</dependency>
2、下载浏览器驱动
(1)谷歌
https://npm.taobao.org/mirrors/selenium
按照浏览器版本下载对应的驱动
(2)火狐
两种报错举例:
Cannot find firefox binary in PATH. Make sure firefox is installed.
错误原因:火狐浏览器安装在其他路径,不是默认的安装路径
解决方法:找到火狐安装的路径,复制路径
System.setProperty("webdriver.firefox.bin", "E:\\360Downloads\\install\\Mozilla Firefox\\firefox.exe");
The path to the driver executable must be set by the webdriver.gecko.driver system property;
错误原因:缺少火狐浏览器驱动包。如果selenium版本是3.x的,需要使用驱动包
浏览器驱动下载:
https://npm.taobao.org/mirrors/geckodriver
(3)设置驱动
把下载完的驱动放在java项目的Driver包下
写代码进行设置
谷歌:
火狐:
System.setProperty("webdriver.gecko.driver", "Driver\\geckodriver.exe");
(4)验证驱动是否配置正确
FirefoxDriver firefoxDriver=new FirefoxDriver();
ChromeDriver chromeDriver=new ChromeDriver();
二、基本元素定位
首先创建驱动
ChromeDriver chromeDriver=new ChromeDriver();
(1)id:根据id获取元素,返回单个元素,id值一般是唯一的
(2)name:根据元素的name属性来获取元素,可能会返回元素集合
(3)tagName:根据元素的标签名来获取元素,可能会返回元素集合
(4)className:根据元素的样式class值来获取元素,可能会返回元素集合
(5)linkText:根据超链接的文本值来获取元素
(6)partialLinkText:根据超链接的部分文本值来获取元素
chromeDriver.get("https://www.baidu.com/");
chromeDriver.findElement(By.id("kw")).sendKeys("Ykbsmn");
三、CssSelector元素定位
(1)css精确定位
根据元素属性,属性名=属性值
By.cssSelector("标签名[属性名='属性值']");
栗子:By.cssSelector("input[name='xxx']");
四、元素操作API
2、
·getTagName():获取元素的的标签名
·getAttribute(属性名):根据属性名获取元素属性值
·getText():获取当前元素的文本值
·isDisplayed():查看元素是否显示
3、WebDriver相关API
首先
ChromeDriver chromeDriver=new ChromeDriver();
chromeDriver.get("https://www.baidu.com/");
(1)get(String url):访问指定url页面
(2)getCurrentUrl():获取当前页面的url地址
System.out.println(chromeDriver.getCurrentUrl());
(3)getTitle():获取当前页面的标题
System.out.println(chromeDriver.getTitle());
(4)getPageSource():获取当前页面源代码
System.out.println(chromeDriver.getPageSource());
(5)quit():关闭驱动对象以及所有相关的窗口
chromeDriver.quit();
(6)close():关闭当前窗口(没有关闭驱动对象)
(7)getWindowHandle():返回当前页面句柄
(8)getWindowHandles():返回所有由驱动对象打开页面所有的句柄,页面不同,句柄不一样
(9)manage():此方法可以获取Options--浏览器菜单操作对象driver.manage().window()
(10)navigate对象的运用
ChromeDriver chromeDriver=new ChromeDriver();
chromeDriver.get("https://www.baidu.com/");
//navigate对象
WebDriver.Navigation navigation=chromeDriver.navigate();
Thread.sleep(1000);
//访问jd
navigation.to("https://www.jd.com");
Thread.sleep(1000);
//刷新页面
navigation.refresh();
Thread.sleep(1000);
//回退
navigation.back();
Thread.sleep(1000);
//前进
navigation.forward();
五、三大等待
1、固定等待
代码执行速度太快,UI元素没有立即显示出来,造成两者不同步,从而元素找不到
Thread.sleep(1000)//1000等于1秒
2、隐式等待
在设置的超时时间范围内不断查找元素,直到找到元素或者超时
优点:相对灵活
缺点:设置是针对全局额,在WebDriver实例整个生命周期有效,但并不是所有的元素都需要等待。
//在driver实例化后完成之后设置隐式等待,设置超时的时间为5s
chromeDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
3、显示等待
用来等待某个条件发生后再继续执行后续代码(如找到元素、元素可点击、元素已显示等)
方法 | 条件 |
visibilityOfElementLocated(By Locator) | 页面元素在页面存在并且可见 |
elementToBeClickable(By Locator) | 页面元素是否在页面上可用和可被单击 |
elementToBeSelected(WebElement element) | 页面元素处于被选中状态 |
textToBePresentInElement(By locator) | 在页面元素中是否包含特定的文本 |
presenceOfElementLocated(By locator) | 页面元素在页面中存在 |
//显示等待
WebDriverWait webDriverWait=new WebDriverWait(chromeDriver, 5);
webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xxxx")));
六、特殊元素操作
1、模态框
(1)alert
chromeDriver.findElement(By.id("xxxx"));
Thread.sleep(1000);
//switchTo.alert 找到对应的alert弹框
Alert alert=chromeDriver.switchTo().alert();
alert.accept();
(2)Confirm
chromeDriver.findElement(By.id("xxxx"));
Thread.sleep(1000);
//switchTo.alert 找到对应的confirm弹框
Alert alert=chromeDriver.switchTo().alert();
alert.accept();
//alert.dismiss();
2、iframe(四种切换方式)
//进入第一个内嵌页面中定位元素,输入数据
//切换iframe
chromeDriver.switchTo().frame("bframe");
chromeDriver.findElement(By.id("bb")).sendKeys("222");
//回到默认的页面
chromeDriver.switchTo().defaultContent();
3、window
当你要操作另外一个窗口时,一定要注意先切换窗口。切换方式:传入要操作窗口的name或者句柄handle
通过传入的句柄切换窗口
chromeDriver.get("a.html");
chromeDriver.findElement(By.id("aa")).sendKeys("这是第一个窗口");
Thread.sleep(1000);
//切换到b窗口
chromeDriver.findElement(By.id("bb")).click();
//虽然切换到b窗口,但是句柄还是在a窗口,所以操作的还是a窗口
Thread.sleep(1000);
//句柄的切换
//进入到b窗口之后,获取所有句柄,然后通过for循环找到b窗口的句柄
Set<String> handles=chromeDriver.getWindowHandles();
for(String handle:handles){
//切换句柄
chromeDriver.switchTo().window(handle);
if(chromeDriver.getTitle().equals("b.html")){
//如若标题是符合的话,就跳出循环
break;
}
}
//对b窗口的元素进行定位
chromeDriver.findElement(By.id("bb")).sendKeys("这是第二个窗口");