你有沒有注意到網上衝浪時無處不在的網絡表單?您訪問的幾乎每個網站或web應用程式都利用web表單獲取有關您自己的相關信息。從在web應用程式上創建一個帳戶到填寫一個簡短的調查,Web表單無處不在!表單包括複選框、單選按鈕、密碼、下拉以收集用戶數據等web元素。
如果你要表演自動瀏覽器測試對於您的網站或web應用程式,那麼您根本負擔不起從您的測試自動化腳本中刪除表單。說到測試自動化,Selenium有一個API來幫助查找這些Web元素並對它們採取後續的操作,比如選擇一個值或輸入一些文本。
本文將幫助您理解如何訪問Selenium中的表單來自動化Web應用程式的瀏覽器測試。我將使用JUnit框架和一些注釋來執行硒自動化測試在本文的後面。
首先,我們將了解WebElement是什麼,如何在Selenium自動化中訪問WebElement,然後查看基本的表單元素,比如輸入框、按鈕、可以在這些表單上執行的操作,最後編寫一個腳本來處理表單並在各種瀏覽器上運行它。如果您已經知道基本知識,那麼可以根據自己的情況跳過這些部分:
什麼是 WebElement?
在外行人的語言中,網頁上的任何內容都構成了WebElement。示例可以是文本框、單選按鈕等。Selenium Webriver提供了一個名為WebElement負責所有可能發生在網頁中的交互。要找到這些WebElement,SeleniumWebDriver提供了兩個方法,即findElement()和findElements()。
findElement():此方法用於定位單個Web元素。找到元素後,它作為WebElement對象返回。現在讓我們看看findElement()的語法,但是在我們開始在測試腳本中使用WebElement對象之前,我們需要注意一個非常重要的問題。
在開始創建WebElement的對象之前,我們需要導入下面的包:
import org.openqa.selenium.WebElement;
findElement()的語法:
WebElement ele = driver.findElement(By.xpath(---xpath---);
findElements():它返回與方法中定義的定位器對應的WebElement列表。findElements()的語法如下所示:
List<WebElement> ele = driver.findElements(By.xpath(---xpath---);
現在我們已經完全了解了WebElement接口,以及Selenium自動化測試中findElement()和findElements()方法之間的區別。
現在是深入研究這些Web元素的時候了。我們現在將列出所有可能涉及您的網站或網頁申請表格的網頁欄位。然後,我們將注意如何訪問SeleniumWebDriver中的表單。
以Selenium形式訪問的欄位類型
為了隨後構建在SeleniumWebDriver中訪問表單的腳本,我們需要了解測試自動化腳本中必須處理的各個欄位。讓我們試著一個接一個地挖掘這些WebElement。
輸入箱
輸入框是任何形式的主元素。沒有用戶的輸入,任何表單都是不完整的。它可分為兩類:
文本框-顯示用戶輸入的值的文本框。密碼欄位框-當用戶輸入值時顯示特殊字符(大部分為「*」)的文本框。以下是表示表單內輸入框的圖像。
Buttons
在訪問Selenium自動化測試表單時,需要考慮的最重要領域之一。如果沒有提交表單的接口,就沒有必要填寫表單。按鈕只用於提交我們在文本框中填寫的任何信息。這可以是提交某種形式的數據,或者簡單地向伺服器提交登錄信息。
CheckBox
在大多數被廣泛使用的網站中,我們看到一個小框,使我們能夠檢查或取消它。主要是在協議部分,用戶需要確認對這些策略的理解。複選框用於返回布爾值,如果選中它,則返回True,否則返回false。
Radio Button
記得當我們在任何一個註冊表格中選擇我們的性別時,在屏幕上看到一個圓形元素嗎?這就是單選按鈕。它類似於複選框,只不過不同之處在於,如果給我們多個單選按鈕,我們只能選擇一個,而在多個複選框的情況下,我們可以選擇多個單選按鈕。
Link
我們都面臨著忘記帳戶密碼的共同問題。注意到屏幕上的忘記密碼連結了嗎?這就是聯繫。它將我們重定向到一個新的網頁或一個新窗口彈出或類似的東西。它將我們連結到一個全新的URL。
Drop Down
對於一個特定類別有多個選項的網站,有時會出現這樣的情況。比如說一個網站來預訂你的機票。要獲取原產地和目的地城市,我們經常會看到一個具有多個值的列表。這個列表在最右邊的一端有一個箭頭來展開和顯示值,稱為下拉列表。它向用戶提供選項列表,從而根據需求提供對一個或多個值的訪問。
下面是Facebook如何使用表單的快照。
如何用Selenium在表單中Web元素?
現在我們已經知道了我們可以在應用程式中遇到哪些不同類型的Web元素,我們需要通過Selenium自動化測試腳本來識別這些Web元素,並為此使用Selenium定位器。定位器是提供給findElement()或findElements()方法的參數,這些方法通過使用web元素的屬性(如ID、name、Class等)來幫助檢索Web元素。通常,Selenium中有8個定位器,它們被廣泛使用:
ID名字標籤名類名LinkText部分LinkTextXPathCSS選擇器很少有這樣的例子:
WebElement eid = driver.findElement(By.id(「email」);
WebElement pswd = driver.findElement(By.name(「password」);
WebElement sbmtBtn = driver.findElement(By.xpath(「//input[@value=」submit」]」);
以類似的方式,我們可以使用By.className、By.CSSSelector()、By.link text()等。
通過訪問Selenium中的表單與Web元素交互
在通過Selenium自動化測試訪問表單時,找到這些Web元素只是半途而廢。現在,在Selenium中訪問表單的關鍵是。使用Selenium執行操作和與表單交互。讓我們看看如何對其中每一個執行不同的操作。
1.輸入箱
要處理任何輸入框,我們必須能夠輸入信息、清除信息或從框中獲取信息。Selenium提供的處理文本框的不同方法如下:
SendKeys()清空()getText()若要在文本框中輸入文本,可以使用發送鍵方法,該方法將從我們的自動化腳本中輸入用戶所需的文本。
driver.findElement(By.id(「username」).sendKeys(「abc@gmail.com」);
上述語句將輸入電子郵件ID為ABC@gmail.com輸入ID為用戶名的文本框中。現在,要清除預先輸入的文本或上次輸入的文本,可以使用清空()方法。
driver.findElement(By.id(「username」)).clear();
可用於文本框的第三個方法是getText()方法。它將獲取在文本框中寫入的文本,以防我們需要驗證現有文本或輸入的文本。
String nameText = driver.findElement(By.id(「username」)).getText();
上面的代碼行將返回文本,讓我們接受上面第一行代碼輸入的文本,即ABC@gmail.com並將其存儲在字符串類型的nameText變量中。當文本出現在Value屬性中時,可能會出現這種情況。在這種情況下,我們將使用getAttribute()方法代替getText()。
String nameText = driver.findElement(By.id(「username」)).getAttribute(「value」);
2.按鈕
我們可以使用按鈕提交信息。這可以通過單擊相同的操作來完成。下面是Selenium中用於對按鈕執行操作的方法。
點擊()提交()看起來這兩種方法並沒有什麼區別,但是一個非常細微的細節改變了每個方法的用法。這兩種方法最終都會將表單數據提交給伺服器,但我們需要了解存在的Web元素的類型。如果元素類型為「Submit」或「按鈕」,則單擊()方法將兩者都適用,但如果元素類型為「Submit」,且按鈕位於其中
標記,那麼只有Submit()才能工作。如果其中任何條件為false,則submit()將無法工作。
以下是這兩種語言的語法:
driver.findElement(By.id(「submtLogIn」).click();
driver.findElement(By.id(「submtLogIn」).submit()
3.複選框
在使用複選框時,我們將使用以下Selenium方法:
點擊()isSelected()要選擇或檢查一個值,我們使用click()方法。它只是將狀態從未檢查更改為CHECK,反之亦然。
driver.findElement(By.id(「name」)).click();
既然我們可以選中/取消選中複選框,那麼在執行Selenium自動化測試的特定操作之前,我們可能首先需要知道複選框的狀態。要獲得狀態,我們使用isSelected()方法,它將返回一個布爾值。這意味著如果選中複選框,我們將得到一個True,否則我們將得到假。
boolean state = driver.findElement(By.id(「name」)).isSelected();
4.收音機按鈕
在單選按鈕上執行的操作類似於複選框上的操作,我們也可以對單選按鈕使用與上面相同的方法。
點擊()isSelected()
5.聯繫
連結通常嵌入在網頁中,讓我們導航到一個新的屏幕,彈出或表單。我們可以對它們執行單擊操作,也可以獲取它所保存的文本,然後繼續執行。
點擊()getText()上述兩種方法都可以以類似上述的方式使用。
6.下拉
下拉列表在web應用程式中非常常見,並且廣泛用於在一系列選項中進行選擇。有各種各樣的方法,我們可以使用下拉。讓我們逐一看看它們及其相應的語法和用法。
selectByVisibleText(字符串)-它通過比較可見文本來選擇選項,其中在方法中傳遞的字符串值是要比較的。
selectByIndex(Int)-基於下拉菜單中的索引選擇選項,整數參數作為索引傳遞。
selectByValue(字符串)-基於字符串格式的選項值選擇選項
以類似的方式,我們可以使用以下任何選項從下拉列表中取消選擇任何選定的值:
deselectByVisibleText(字符串)
deselectByIndex(INT)
deselectByValue(字符串)
deSelectAll()-這將取消從下拉列表中選擇的所有選項。
要在Selenium代碼中使用上述任何方法,語法可以如下所示:
Select se=new Select(driver.findElement(By.id("nation")));
se.selectByValue("Ind");
在對我們的web應用程式執行Selenium自動化測試時,有時我們需要驗證下拉列表中的選項,或者我們是否可以選擇多個選項。使用Selenium非常容易地對這些操作進行排序,這使我們能夠執行更多的操作。以下是其中幾個:
getAllSelectedOptions()-我們可能會遇到下拉列表,在其中我們可以選擇多個選項。現在,要獲得所有選定選項的列表,我們可以使用此方法。
getFirstSelectedOption()-此方法將返回從下拉列表中選擇的第一個選項,與上面的方法不同,它將返回單個web元素,而不是列表。
getOptions()-此方法將使我們能夠在下拉列表中獲得所有可用選項的列表。
isMultiple()-要檢查下拉列表是否可以採用多個選項,我們可以使用isMultiple()方法返回一個布爾值。
要獲得選項列表,我們可以通過引用List對象來編寫代碼:
Select se=new Select(driver.findElement(By.id("nation"))); List<WebElement>
list=se.getOptions();
現在我們已經了解了Web元素的基本操作和處理,讓我們繼續在Selenium腳本中實現這些操作。在下一節中,我將向您展示一個處理演示站點上表單元素的簡單程序。
通過Selenium WebDriver處理表單元素
現在,我們將自動化Facebook註冊功能,以訪問Selenium中的表單,因為我們在Web元素上執行操作。下面是一個使用Java使用JUnit框架訪問Selenium表單的測試腳本。
//Complete code to run the test of facebook sign up
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
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.support.ui.Select;
public class TestForms {
static WebDriver driver;
@BeforeClass
public static void setUp(){
System.out.println("-----This is the beginning of our test !!!-----");
System.setProperty("webdriver.chrome.driver", "C:\\Users\\admin\\Downloads\\chromedriver_win32(1)\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://facebook.com");
}
@Test
public void fillForm(){
System.out.println("-----Let us start the sign up process!!!-----");
/*
* Handling text boxes to enter and clear values
*/
WebElement fName = driver.findElement(By.xpath("//input[@name='firstname']"));
fName.sendKeys("--Enter you name here--");
WebElement lName = driver.findElement(By.xpath("//input[@name='lastname']"));
lName.sendKeys("--Enter your last name--");
//Clear the textbox
lName.clear();
lName.sendKeys("XYZ");
WebElement eMail = driver.findElement(By.xpath("//input[@name='reg_email__']"));
eMail.sendKeys("--Enter mail or contact number--");
WebElement pwd = driver.findElement(By.xpath("//input[@name='reg_passwd__']"));
pwd.sendKeys("--Enter a valid password here--");
/*
* Handling dropdown to select date of birth
*/
Select date = new Select(driver.findElement(By.xpath("(id('day'))")));
date.selectByVisibleText
通過運行上面的腳本,您將能夠使用JUnit訪問Selenium中的表單。如果你們不熟悉JUnit的話。以下是使用JUnit運行第一個Selenium自動化測試腳本的端到端指南。
關於更快測試周期的可伸縮性的思考?
幹得好!但是,如果您要訪問web應用程式的Selenium表單,那麼您的測試套件很可能會變得更大、更複雜。您需要在數百個瀏覽器+作業系統上訪問Selenium中的表單。不知道為什麼?
那麼,您的表單可能不像您想像的那樣兼容跨瀏覽器!下面是一個簡單的Datetime輸入欄位在呈現中的不同之處。
日期時間(IE8)
GoogleChrome 72中的日期時間
這讓我們回到了一個重要的問題!如何在SeleniumWebDriver中訪問超過100個瀏覽器+OS的表單?
好吧,首先你可以繼續建立Selenium Grid。然而,如果您有一個更大的測試套件,豐富的測試需求,那麼您可能需要花費大量的金錢和時間來擴展您的內部Selenium Grid。您將需要繼續添加正在啟動的最新設備、瀏覽器和作業系統到Selenium Grid中。考慮到採用敏捷、看板和其他現代SDLCS(軟體開發生命周期),主要的瀏覽器供應商,作業系統每個月推出一個新版本。
軟體開發生命周期(軟體開發生命周期),主要的瀏覽器供應商,作業系統正在推出一個新的版本每月。
雲上Selenium Grid中的訪問表單
讓我向您演示一種在Selenium中訪問表單的可伸縮方法。我將使用LambdaTest的Online Selenium Grid在不同的瀏覽器和作業系統中並行運行上述腳本。在我們開始在LambdaTest上運行腳本之前,我們需要處理以下幾點:
而不是調用常規的FirefoxDriver,我們必須使用遠程WebDriver以及與瀏覽器、其版本、作業系統等相關的功能。由於我們已經在本地創建了腳本,因此我們將使用Selenium所需的功能生成器,通過提供一些細節,如OS、解析度、瀏覽器(&它的版本)、Selenium版本、位置等等,這個生成器將提供幾行代碼,這些代碼將根據我們的選擇如下所示。
現在,我們只需要在Selenium自動化測試腳本中聲明LambdaTest身份驗證憑據。這樣,WebDriver將知道它需要處理的正確的集線器URL。下面是我們將用於在LambdaTest上運行測試的最後一個腳本。對現有腳本的更改將突出顯示。import java.net.MalformedURLException;
import java.net.URL;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.Select;
public class TestForms {
static String username = "Your UserName";
static String accesskey = "Your Access Key";
static RemoteWebDriver driver = null;
static String gridURL = "@hub.lambdatest.com/wd/hub";
boolean status = false;
@BeforeClass
public static void setUp(){
System.out.println("-----This is the beginning of our test !!!-----");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("build", "TestFormsV1.0");
capabilities.setCapability("name", "SeleniumForms");
capabilities.setCapability("platform", "Windows 10");
capabilities.setCapability("browserName", "Chrome");
capabilities.setCapability("version","79.0");
capabilities.setCapability("selenium_version","3.13.0");
capabilities.setCapability("geoLocation","IN");
capabilities.setCapability("chrome.driver","78.0");
try {
driver = new RemoteWebDriver(new URL("https://" + username + ":" + accesskey + gridURL), capabilities);
}
catch (MalformedURLException e) {
System.out.println("Invalid grid URL");
} catch (Exception e) {
System.out.println(e.getMessage());
}
driver.manage().window().maximize();
}
@Test
public void fillForm(){
driver.get("https://facebook.com");
System.out.println("-----Let us start the sign up process!!!-----");
/*
* Handling text boxes to enter and clear values
*/
WebElement fName = driver.findElement(By.xpath("//input[@name='firstname']"));
fName.sendKeys("--Enter you name here--");
WebElement lName = driver.findElement(By.xpath("//input[@name='lastname']"));
lName.sendKeys("--Enter your last name--");
//Clear the textbox
lName.clear();
lName.sendKeys("XYZ");
WebElement eMail = driver.findElement(By.xpath("//input[@name='reg_email__']"));
eMail.sendKeys("--Enter mail or contact number--");
WebElement pwd = driver.findElement(By.xpath("//input[@name='reg_passwd__']"));
pwd.sendKeys("--Enter a valid password here--");
/*
* Handling dropdown to select date of birth
*/
Select date = new Select(driver.findElement(By.xpath("(id('day'))")));
date.selectByVisibleText("15");
Select month = new Select(driver.findElement(By.xpath("(id('month'))")));
month.selectByVisibleText("Jan");
Select year = new Select(driver.findElement(By.xpath("(id('year'))")));
year.selectByVisibleText("1990");
/*
* Handling Radio buttons to select gender
*/
driver.findElement(By.className("_58mt")).click();
/*
* Handling the Sign Up button to perform click action
*/
WebElement sgnUp = driver.findElement(By.xpath("//button[@id='u_0_13']"));
sgnUp.click();
}
@AfterClass
public static void tearDown(){
System.out.println("-----We're now closing the session...-----");
driver.quit();
}
}
您可以通過Eclipse或命令行直接運行上述代碼,步驟與我們前面已經完成的步驟相同。在執行腳本時,結果將在Lambda測試儀錶板中獲得。我們一次用並行瀏覽器執行腳本後,我將向您展示相應的結果頁面。接下來是最有趣的部分,我們可以在並行瀏覽器中運行測試,而無需每次打算運行測試時更改瀏覽器細節。
但是在這樣做之前,我們必須創建一個幫助類來領導測試。隨後,我們必須對包含測試腳本的主類進行一些更改,這樣就可以了。在下面的部分中,您將看到使用LambdaTest在不同瀏覽器上並行運行測試的最終測試腳本。
測試腳本容器類
下面的代碼將包含我們打算執行的主要測試腳本。這與上面所寫的類似,在變量中做了一些小的調整。此示例顯示在3種不同瀏覽器上的執行情況。您可以根據您的執行需求修改您的腳本。
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedList;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.Select;
@RunWith(ParallelHelper.class)
public class TestForms {
static String username = "Your User Name";
static String accesskey = "Your Access Key";
static RemoteWebDriver driver = null;
static String gridURL = "@hub.lambdatest.com/wd/hub";
public static String platform;
public static String browserName;
public static String browserVersion;
boolean status = false;
/*
* Creating parameters for the browsers to be used
*/
@Parameterized.Parameters
public static LinkedList<String[]> getEnvironments() throws Exception {
LinkedList<String[]> env = new LinkedList<String[]>();
env.add(new String[]{"WIN10", "chrome", "79.0"});
env.add(new String[]{"WIN10","firefox","71.0"});
env.add(new String[]{"WIN10","internet explorer","11.0"});
return env;
}
public TestForms(String platform, String browserName, String browserVersion) {
this.platform = platform;
this.browserName = browserName;
this.browserVersion = browserVersion;
}
@Before
public void setUp() {
System.out.println("-----This is the beginning of our test !!!-----");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("build", "TestFormsV1.0"); //Can provide you Build Name
capabilities.setCapability("name", "SeleniumForms"); //Provide your Test Name
capabilities.setC
測試腳本助手/運行程序類
該類包含能夠在不同瀏覽器上並行執行測試的代碼。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.junit.runners.Parameterized;
import org.junit.runners.model.RunnerScheduler;
public class ParallelHelper extends Parameterized {
private static class ThreadPoolScheduler implements RunnerScheduler {
private ExecutorService exec;
public ThreadPoolScheduler() {
String threads = System.getProperty("junit.parallel.threads", "10");
int numThreads = Integer.parseInt(threads);
exec= Executors.newFixedThreadPool(numThreads);
}
public void finished() {
exec.shutdown();
try {
exec.awaitTermination(10, TimeUnit.MINUTES);
} catch (InterruptedException exc) {
throw new RuntimeException(exc);
}
}
public void schedule(Runnable childStatement) {
exec.submit(childStatement);
}
}
public ParallelHelper(Class<?> klass) throws Throwable {
super(klass);
// TODO Auto-generated constructor stub
}
}
在運行上述類時,我們將看到我們的測試在LambdaTestCloud上運行,並生成測試結果。請注意,您可以在EclipseIDE上看到進展&隨後,結果(如執行視頻)可以在LambdaTestAutomationDashboard上獲得。下面是在LambdaTestDashboard中執行結果的快照:
另一方面,EclipseIDE控制臺和結果將顯示如下:
您能夠訪問Selenium WebDriver中的表單嗎?
我希望這個SeleniumJava教程幫助您訪問SeleniumWebDriver中的表單。記住,表單對於每一家在線經營的企業來說都是基本的。幾乎每個Web應用程式都通過表單收集用戶信息。作為一個自動化測試人員,您需要確保兩件事:
您的所有表單都按其應有的功能工作。您的所有表單都是跨瀏覽器兼容的,因此每個客戶都可以訪問它們。