順的網(wǎng)站建設咨詢免費國外ddos網(wǎng)站
目錄
1.Selenium概述
? ?1.1什么是Selenium
? ?1.2Selenium的優(yōu)勢
? ?1.3Selenium WebDriver原理
2.Selenium環(huán)境搭建
3.Selenium 簡單示例
4.八大元素定位
? ?4.1定位方式
? ?4.2定位方式的用法
5.Selenium API
? ?5.1WebDriver 常用 API
? ?5.2WebElement 常用 API
? ?5.3代碼示例
6.元素等待機制
? ?6.1硬性等待
? ?6.2隱式等待
? ?6.3顯式等待
? ?6.4頁面加載超時設置
7.彈出框處理(alert,confirm)
8.控制瀏覽器操作
9.模擬鼠標鍵盤操作
10.操作javaScript代碼
1.Selenium概述
? ?1.1什么是Selenium
Selenium 是一種開源工具,用于在 Web 瀏覽器上執(zhí)行自動化測試(使用任何 Web 瀏覽器進行 Web 應用程序測試)。提供一套測試函數(shù),用于支持Web自動化測試。函數(shù)非常靈活,能夠完成界面元素定位、窗口跳轉、結果比較。重申一下,Selenium 僅可以測試Web應用程序。我們既不能使用 Selenium 測試任何桌面(軟件)應用程序,也不能測試任何移動應用程序。
具有如下特點:
- 多瀏覽器支持
- 如IE、Firefox、Safari、Chrome、Android手機瀏覽器等。
- 支持多語言
- 如Java、C#、Python、Ruby、PHP等。
- 支持多操作系統(tǒng)
- 如Windows、Linux、IOS、Android等。
- 開源免費
- 官網(wǎng):Selenium
? ?1.2Selenium的優(yōu)勢
由于 Selenium 是開源的,因此不涉及許可費用,這是與其他測試工具相比的主要優(yōu)勢。當然Selenium 日益流行的其他原因是:
- 測試腳本可以用以下任何一種編程語言編寫:Java、Python、C#、PHP、Ruby、Perl?和?.Net
- 可以在以下任何操作系統(tǒng)中進行測試:Windows、Mac?或?Linux
- 可以使用任何瀏覽器進行測試:Mozilla Firefox、Internet Explorer、Google Chrome、Safari?或?Opera
- 可以與?TestNG?和?JUnit?等工具集成,以管理測試用例和生成報告
- 可以與?Maven、Jenkins?和?Docker?集成以實現(xiàn)持續(xù)測試
有優(yōu)點當然也會存在缺點
- 我們只能使用 Selenium 來測試 Web 應用程序。我們無法測試桌面應用程序或任何其他軟件
- 沒有針對 Selenium 的保證支持。我們需要利用現(xiàn)有的客戶社區(qū)
- 無法對圖像進行測試。我們需要將 Selenium 與 Sikuli 集成以進行基于圖像的測試
- 沒有本機報告工具。但是我們可以通過將其與 TestNG 或 JUnit 之類的框架集成來解決該問題
? ?1.3Selenium WebDriver原理
只看圖是不是有點模糊,我們可以用一個例子結合來理解:
將 WebDriver 驅動瀏覽器類比成開出租車的場景。
在開出租車時有三個角色:
-
乘客:他/她告訴出租車司機去哪里,大概怎么走。
-
出租車司機:他按照乘客的要求來操控出租車。
-
出租車:出租車按照司機的操控完成真正的行駛,把乘客送到目的地。
?
在WebDriver中也有類似的三個角色:
- 工程師寫的自動化測試代碼:自動化測試代碼發(fā)送請求給瀏覽器的驅動(比如火狐驅動、谷歌驅動)
- 瀏覽器的驅動:它來解析這些自動化測試的代碼,解析后把它們發(fā)送給瀏覽器
- 瀏覽器:執(zhí)行瀏覽器驅動發(fā)來的指令,并最終完成工程師想要的操作。
?
?
2.Selenium環(huán)境搭建
我們以Java為例,瀏覽器驅動以chrome為例
1.首先下載瀏覽器對應版本驅動
先確定谷歌瀏覽器版本,打開瀏覽器,點擊幫助、關于Google Chrome
?
查看瀏覽器版本
?
下載谷歌瀏覽器對應版本驅動?
下載地址:http://chromedriver.storage.googleapis.com/index.html
或CNPM Binaries Mirror
?
如果你的谷歌瀏覽器是115.0版本開頭,因為是最新版?
鏈接:Chrome for Testing availability
點擊鏈接,找到對應版本的驅動,復制鏈接下載即可。
突然的升級,淘寶鏡像找不到對應版本,可以git搜一下。
?
下載解壓后設置瀏覽器驅動?
設置瀏覽器的地址非常簡單。 我們可以手動創(chuàng)建一個存放瀏覽器驅動的目錄,如: C:\driver , 將下載的瀏覽器驅動文件(例如:chromedriver、geckodriver)丟到該目錄下。
我的電腦–>屬性–>系統(tǒng)設置–>高級–>環(huán)境變量–>系統(tǒng)變量–>Path,將“C:\driver”目錄添加到Path的值中。
驗證瀏覽器驅動
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.opera.OperaDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriver;WebDriver driver = new ChromeDriver(); //Chrome瀏覽器WebDriver driver = new FirefoxDriver(); //Firefox瀏覽器WebDriver driver = new EdgeDriver(); //Edge瀏覽器WebDriver driver = new InternetExplorerDriver(); // Internet Explorer瀏覽器WebDriver driver = new OperaDriver(); //Opera瀏覽器WebDriver driver = new PhantomJSDriver(); //PhantomJS
3.Selenium 簡單示例
我們示例以打開百度進行搜索:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class BaiduSearch {public static void main(String[] args) {// 1.創(chuàng)建webdriver驅動WebDriver driver = new ChromeDriver();// 2.打開百度首頁driver.get("https://www.baidu.com");// 3.獲取輸入框,輸入seleniumdriver.findElement(By.id("kw")).sendKeys("selenium");// 4.獲取“百度一下”按鈕,進行搜索driver.findElement(By.id("su")).click();// 5.退出瀏覽器driver.quit();}
}
4.八大元素定位
為什么要進行元素定位?
? 我們必須告訴 selenium 怎么去定位元素,用來模擬用戶的動作,或者查看元素的屬性和狀態(tài),以便于我們可以執(zhí)行檢查。例如:我們要搜索一個產(chǎn)品,首先要找到搜索框與搜索按鈕,接著通過鍵盤輸入要查詢的關鍵字,最后鼠標單擊搜索按鈕,提交搜索請求。
? 正如上述的人工操作步驟一樣,我們也希望 selenium 能模擬這樣的動作,然而,selenium 并不能理解類似在搜索框中輸入關鍵字或者點擊搜索按鈕這樣的圖形化的操作。所以需要我們程序化的告訴 selenium 如何定位搜索框和搜索按鈕,從而模擬鍵盤和鼠標的操作。
? ?4.1定位方式
selenium 提供了8種的定位方式:
- id
- name
- class name
- tag name
- link text
- partial link text
- xpath
- css selector
這8種定位方式在java selenium 中對應的方法為:
同時這8種方法都對應有著返回復數(shù)元素的方法,分別在調用的方法findElements(By.id()) 加上一個s:
- findElements(By.id())
- findElements(By.name())
- findElements(By.className())
- findElements(By.tagName())
- findElements(By.linkText())
- findElements(By.partialLinkText())
- findElements(By.xpath())
- findElements(By.cssSelector())
? ?4.2定位方式的用法
假如我們有一個Web頁面,通過前端工具查看到一個元素的屬性是這樣的。
<html><head><body link="#0000cc"><a id="result_logo" href="/" onmousedown="return c({'fm':'tab','tab':'logo'})"><form id="form" class="fm" name="f" action="/s"><span class="soutu-btn">按鈕</span><input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">
我們的目的是要定位input標簽的輸入框。
- 通過id定位:
driver.findElement(By.id("kw"))
- 通過name定位:
driver.findElement(By.name("wd"))
- 通過class name定位:
driver.findElement(By.className("s_ipt"))
- 通過tag name定位:
driver.findElement(By.tagName("input"))
- 通過xpath定位,xpath定位有很多種寫法,這里列幾個常用寫法:
driver.findElement(By.xpath("//*[@id='kw']")) // id定位
driver.findElement(By.xpath("//*[@name='wd']")) // 屬性值定位
driver.findElement(By.xpath("//span[text()='按鈕']")) // 文本定位
driver.findElement(By.xpath("//input[@class='s_ipt']")) // class屬性定位
driver.findElement(By.xpath("/html/body/form/span/input")) // 絕對路徑定位
driver.findElement(By.xpath("//span[@class='soutu-btn']/input")) // 相對路徑定位
driver.findElement(By.xpath("//form[@id='form']/span/input"))
driver.findElement(By.xpath("//input[@id='kw' and @name='wd']")) // 多組合屬性定位
driver.findElement(By.xpath("//span[contains(text(),'按鈕')]")) // 是否包含文本
- 通過css定位,css定位有N種寫法,這里列幾個常用寫法(博主更推薦使用css):
driver.findElement(By.cssSelector("#kw") // id定位
driver.findElement(By.cssSelector("[name=wd]") // name屬性值定位
driver.findElement(By.cssSelector(".s_ipt") // class地位
driver.findElement(By.cssSelector("html > body > form > span > input") // css層級定位
driver.findElement(By.cssSelector("span.soutu-btn> input#kw")
driver.findElement(By.cssSelector("form#form > span > input")
接下來,我們的頁面上有一組文本鏈接。?
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新聞</a>
<a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>
- 通過linkText定位:
driver.findElement(By.linkText("新聞")
driver.findElement(By.linkText("hao123")
- 通過 partialLinkText 定位:
driver.findElement(By.partialLinkText("新")
driver.findElement(By.partialLinkText("hao")
driver.findElement(By.partialLinkText("123")
5.Selenium API
? ?5.1WebDriver 常用 API
WebDriver 提供了一系列的 API 來和瀏覽器進行交互,如下:
?
? ?5.2WebElement 常用 API
?通過 WebElement 實現(xiàn)與網(wǎng)站頁面上元素的交互,這些元素包含文本框、文本域、按鈕、單選框、div等,WebElement提供了一系列的方法對這些元素進行操作:
? ?5.3代碼示例
public class BaiduSearch {public static void main(String[] args) {// 1.創(chuàng)建webdriver驅動WebDriver driver = new ChromeDriver();// 2.打開百度首頁driver.get("https://www.baidu.com");// 獲取搜索框元素WebElement inputElem = driver.findElement(By.id("kw"));// clear()方法,清空輸入框內(nèi)容inputElem.clear();// sendKeys()方法,在搜索框中輸入搜索內(nèi)容inputElem.sendKeys("selenium");// 元素是否顯示boolean displayed = inputElem.isDisplayed();System.out.println(displayed); // 輸出true// 元素是否啟用boolean enabled = inputElem.isEnabled();System.out.println(enabled); // 輸出true// 判斷元素是否被選中狀態(tài),一般用在Radio(單選),Checkbox(多選),Select(下拉選)// 在輸入框中使用無意義boolean selected = inputElem.isSelected();System.out.println(selected); // 輸出fasle// 獲取標簽名String tagName = inputElem.getTagName();System.out.println(tagName); // 輸出input// 獲取屬性名(name屬性)String name = inputElem.getAttribute("name");System.out.println(name); // 輸出wd// 獲取文本值String text = inputElem.getText();System.out.println(text); // 輸出selenium// 通過submit提交driver.findElement(By.id("su")).submit();// click()方法,點擊百度一下按鈕driver.findElement(By.id("su")).click();// 退出瀏覽器driver.quit();}
}
6.元素等待機制
在對元素進行定位時,有時候網(wǎng)頁加載時間比較長,元素還沒有加載出來,這個時候去查找這個元素的話程序中就會拋出異常,所以我們在編寫代碼時需要考慮延時問題,在selenium中有幾種延時機制可以使用如下:
? ?6.1硬性等待
? 硬性等待就是不管你瀏覽器元素是否加載完成,都要進行等待設置好的時間,利用 java 語言中的線程類 Thread 中的 sleep 方法,進行強制等待。
Thread.sleep(long millis)
該方法會讓線程進行休眠。
如:Thread.sleep(3000) 表示程序執(zhí)行的線程暫停 3 秒鐘。
? 這種方法在一定的程度上是可以解決元素加載過慢的情況,但是不建議使用該方法,因為一般情況下我們無法判斷網(wǎng)頁到底需要多長時間加載完成,如果我們設置的時間過長,非常影響效率。
? ?6.2隱式等待
隱式等待的理解,就是我們通過代碼設置一個等待時間,如果在這個等待時間內(nèi),網(wǎng)頁加載完成后就執(zhí)行下一步,否則一直等待到時間截止。
代碼表示:
driver.manage.timeouts.implicitlyWait(long time, TimeUtil unit);
? 這種方法相對于硬性等待顯的會靈活一點,但是隱式等待也有個弊端,因為這個設置是全局的,程序需要等待整個頁面加載完成,直到超時,有時候我需要找的那個元素早就加載完成了,只是頁面上有個別其他元素加載比較慢,程序還是會一直等待下去。直到所有的元素加載完成在執(zhí)行下一步。?
? ?6.3顯式等待
顯示等待是等待指定元素設置的等待時間,在設置時間內(nèi),默認每隔0.5s檢測一次當前的頁面這個元素是否存在,如果在規(guī)定的時間內(nèi)找到了元素則執(zhí)行相關操作,如果超過設置時間檢測不到則拋出異常。默認拋出異常為:NoSuchElementException。推薦使用顯示等待。
代碼表示:
WebDriberWait wait = new WebDriverWait(dirver, timeOutInSeconds);
wait.nutil(expectCondition);
具體使用案例:
1.查找元素是否已經(jīng)加載出來
WebDriverWait wait = new WebDriverWait(driver, 5);
// 查找id為“kw"的元素是否加載出來了(已經(jīng)在頁面DOM中存在)
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("kw")));// 在設定時間內(nèi)找到后就返回,超時直接拋異常
2.查找元素是否可見?
WebDriverWait wait = new WebDriverWait(driver, 5);
// 查找id為"kw"的元素是否可見
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("kw")));
3.查找元素是否可點擊?
WebDriverWait wait = new WebDriverWait(driver, 5);
// 查找id為"kw"的元素是否可以點擊
wait.until(ExpectedConditions.elementToBeClickable(By.id("kw")));
? ?6.4頁面加載超時設置
通過TimeOuts 對象進行全局頁面加載超時的設置,該設置必須放置get 方法之前。如下代碼:
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
driver.get("https://www.baidu.com");
如果百度首頁在超過5秒鐘沒有加載完畢,程序就會拋出異常,如果在 2秒就加載完了,就直接往下執(zhí)行,如果需要對頁面加載時間有要求的,可以用這個設置進行檢驗。?
7.彈出框處理(alert,confirm)
7.1操作alert、confirm彈出框,可以通過Alert 對象來進行操作,Alert類包含了確認、取消、輸入和獲取彈出窗內(nèi)容。
Alert對應屬性和方法:
?
簡單使用示例:?
// 首先需要切換到彈出框中,獲取Alert對象。
Alert alert = driver.switchTo().alert();
// 獲取彈窗文本內(nèi)容
alert.getText();
// 點擊確定按鈕
alert.accept();
// 點擊取消按鈕
alert.dismiss();
7.2iframe 切換 :
有時候我們定位元素的時候,發(fā)現(xiàn)怎么都定位不了。 這時候你需要查一查你要定位的元素是否在iframe里面。
什么是iframe?
iframe 就是HTML 中,用于網(wǎng)頁嵌套網(wǎng)頁的。 一個網(wǎng)頁可以嵌套到另一個網(wǎng)頁中,可以嵌套很多層。
例如:
main.html
<html>
<head><title>FrameTest</title>
</head>
<body><div id="id1">this is main page's div!</div><input type="text" id="maininput" /><br/><iframe id="frameA" frameborder="0" scrolling="no" style="left:0;position:absolute;" src="frame.html"></iframe>
</body>
</html>
frame.html?
<html>
<head><title>this is a frame!</title>
</head>
<body><div id="div1">this is iframes div,</div><input id="iframeinput"></input>
</body>
</html>
使用selenium 操作瀏覽器時,如果需要操作iframe中的元素,首先需要切換到對應的內(nèi)聯(lián)框架中。
selenium 給我們提供了三個重載的方法,進行操作iframe;
// 方法一:通過 iframe的索引值,在頁面中的位置
driver.switchTo().frame(index);
// 方法二:通過 iframe 的name 或者id
driver.switchTo().frame(nameOrId);
// 方法三:通過iframe 對應的webElement
driver.switchTo().frame(frameElement);
selenium 代碼:?
public static void testIframe(WebDriver driver){// 在 主窗口的時候driver.findElement(By.id("maininput")).sendKeys("main input");// 此時 沒有進入到iframe, 以下語句會報錯//driver.findElement(By.id("iframeinput")).sendKeys("iframe input");driver.switchTo().frame("frameA");driver.findElement(By.id("iframeinput")).sendKeys("iframe input");// 此時沒有在主窗口,下面語句會報錯//driver.findElement(By.id("maininput")).sendKeys("main input");// 回到主窗口driver.switchTo().defaultContent();driver.findElement(By.id("maininput")).sendKeys("main input");
}
注:如果已經(jīng)切換進入了其中的一個 iframe 中,再想對 iframe 外的元素進行操作,需要切換回到默認的頁面中,否則會找不到元素。?
// 切換到默認內(nèi)容頁面
driver.switchTo().defaultContent();
?7.3瀏覽器窗口的切換?
有時候后在操作瀏覽器,可能打開了一個新的窗口,這個時候如果要對新窗口的元素進行操作,需要切換到新窗口中去,怎么去切換呢?在 selenium 中有個叫句柄的概念。
? 什么是句柄,簡單理解就是瀏覽器窗口的一個標識,瀏覽器打開的每個窗口都有唯一的一個標識,也就是句柄,我們可以通過句柄來進行窗口之間的切換,從而來達到我們操作不同窗口的元素。
WebDriver 中提供了兩個 API 來獲取窗口的相關句柄:
// 獲取當前窗口的句柄
String handle = driver.getWindowHandle();
// 獲取所有窗口的句柄,返回一個集合
Set<String> handles = driver.getWindowHandles();
獲取到句柄后,通過對應的方法進行切換:?
// 切換到窗口
driver.switchTo.windwo(String handle);
多窗口之間的切換方法:?
/**
* 切換窗口的方法
* 通過傳入一個標題來找到我們需要的窗口。
* @param title 窗口的標題
*/
public void switchWindow(String title){Set<String> handles = driver.getWindowHandles();// 切換窗口的方式--循環(huán)遍歷handles集合for (String handle : handles) {//判斷是哪一個頁面的句柄??--根據(jù)什么來判斷???titleif(driver.getTitle().equals(title)){break;}else{//切換窗口--根據(jù)窗口標識來切換driver.switchTo().window(handle);}
}
?7.4.select 下拉框處理
如果一個頁面元素是一個下拉框(select),對應下拉框的操作,selenium有專門的類 Select 進行處理。其中包含了單選和多選下拉框的各種操作,如獲得所有的選項、選擇某一項、取消選中某一項、是否是多選下拉框等。?
Select類常用的一些方法:
示例:2345網(wǎng)址導航首頁的城市省份切換。
1.進入2345.com首頁,點擊頭部【切換】進行城市切換,我們切換省份為北京。
?
2.HTML頁面DOM結構.
?
3.代碼編寫,這里需要注意下拉選是在一個iframe中,需要先切換到這個iframe后再操作。
// 創(chuàng)建驅動WebDriver driver = new ChromeDriver();// 打開2345網(wǎng)站driver.get("https://www.2345.com");// 切換城市driver.findElement(By.linkText("切換")).click();// 切換到iframe內(nèi)聯(lián)框架中driver.switchTo().frame("city_set_ifr");// 定位到省份下拉框WebElement province = driver.findElement(By.id("province"));province.click();// 創(chuàng)建Select對象Select select = new Select(province);// 根據(jù)文本來獲取下拉值select.selectByVisibleText("B 北京");driver.quit();
8.控制瀏覽器操作
WebDriver 給我們提供了一個 Window 對象,專門用于對窗口的設置。
對象獲取方法:
Window window = driver.manage().window();
Window 對象的方法有:?
8.2.瀏覽器導航操作?
WebDriver 提供了 Navigation 對象來對瀏覽器進行導航操作,如:前進、后退、刷新等。
Navigation 對象獲取:
Navigation navigate = driver.navigate();
Navigation 對象提供的方法:?
?
9.模擬鼠標鍵盤操作
模擬鼠標
在WebDriver中,關于鼠標的操作我們可以通過 Actions 類來模擬鼠標右擊、雙擊、懸停、拖動等操作。
Actions 類中鼠標操作常用方法:
示例:百度首頁設置懸停下拉菜單
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;public class MouseDemo {public static void main(String[] args) {WebDriver driver = new ChromeDriver();driver.get("https://www.baidu.com/");// 定位元素WebElement search_setting = driver.findElement(By.linkText("設置"));// 創(chuàng)建actions對象Actions action = new Actions(driver);// 模擬鼠標懸停action.clickAndHold(search_setting).perform();driver.quit();}
}
10.操作javaScript代碼
雖然WebDriver提供了操作瀏覽器的前進和后退方法,但對于瀏覽器滾動條并沒有提供相應的操作方法。在這種情況下,就可以借助JavaScript來控制瀏覽器的滾動條。WebDriver提供了executeScript()方法來執(zhí)行JavaScript代碼。
用于調整瀏覽器滾動條位置的JavaScript代碼如下:
<!-- window.scrollTo(左邊距,上邊距); -->
window.scrollTo(0,450);
window.scrollTo() 方法用于設置瀏覽器窗口滾動條的水平和垂直位置。方法的第一個參數(shù)表示水平的左間距,第二個參數(shù)表示垂直的上邊距。其代碼如下:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.JavascriptExecutor;public class JSDemo {public static void main(String[] args) throws InterruptedException{WebDriver driver = new ChromeDriver();//設置瀏覽器窗口大小driver.manage().window().setSize(new Dimension(700, 600));driver.get("https://www.baidu.com");//進行百度搜索driver.findElement(By.id("kw")).sendKeys("webdriver api");driver.findElement(By.id("su")).click();Thread.sleep(2000);//將頁面滾動條拖到底部((JavascriptExecutor)driver).executeScript("window.scrollTo(100,450);");Thread.sleep(3000);driver.quit();}
}
通過瀏覽器打開百度進行搜索,并且提前通過 window().setSize() 方法將瀏覽器窗口設置為固定寬高顯示,目的是讓窗口出現(xiàn)水平和垂直滾動條。然后通過 executeScript() 方法執(zhí)行JavaScripts代碼來移動滾動條的位置。
將滾動條滾動到某個區(qū)域后停止(頁面元素全部加載完成),如下:
//滾動到某一區(qū)域
//scrollIntoView(0); 讓元素滾動到可視區(qū)域的最下方
//scrollIntoView(); 讓元素滾動到可視區(qū)域的最上方
//JavascriptExecutor javascriptExecutor = (JavascriptExecutor)BrowserUtil.driver;
//javascriptExecutor.executeScript("document.getElementById('index_ads').scrollIntoView(0);");
//JavaScript的參數(shù)傳遞-selenium和js的交互
//1、先去找到這個元素
WebElement webElement = driver.findElement(By.xpath("element"));
//2、找到的元素作為參數(shù)傳入到Js代碼中
JavascriptExecutor javascriptExecutor = (JavascriptExecutor)driver;
javascriptExecutor.executeScript("arguments[0].scrollIntoView(0)",webElement);
頁面元素是通過懶加載方式,需要一直進行滾動的?
/**
* 滑動列表找元素并且進行點擊(懶加載)
* @param selectedText 選中元素文本
* @param by 正在加載類似元素的定位表達式
*/
public static void clickElementInList(String selectedText, By by) {// 滑動之前的頁面源代碼信息String beforeSource = "";// 滑動之后的頁面源代碼信息String afterSource = "";// 循環(huán)條件// 1、找到了元素,跳出循環(huán)// 2、如果沒有找到元素???怎么跳出循環(huán)while (true) {WebElement webElement = driver.findElement(by);// 獲取頁面源代碼beforeSource = driver.getPageSource();// 獲取js執(zhí)行器JavascriptExecutor javascriptExecutor = (JavascriptExecutor)driver;// 執(zhí)行jsjavascriptExecutor.executeScript("arguments[0].scrollIntoView(0);", webElement);// 如果當前頁面有想要的元素,怎么判斷是否有??--getPageSourceif (driver.getPageSource().contains(selectedText)) {driver.findElement(By.linkText(selectedText)).click();// 找到元素退出循環(huán),不再滾動。break;}afterSource = driver.getPageSource();// 頁面元素沒有變化---滑動到了最底部if (afterSource.equals(beforeSource)) {// 到達底部,退出。break;}}
}