Selenium WebDriver功能測試
一、環境搭配
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("這是第二個視窗");