1. 程式人生 > 其它 >Selenium WebDriver功能測試

Selenium WebDriver功能測試

技術標籤:功能測試Seleniumjavawebjava

一、環境搭配

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("這是第二個視窗");