SF

""

Mở Tab mới trong Selenium

 Mở Tab mới trong Selenium


Robot Class to Open Tab

Như chúng ta đã biết, Robot class trong Selenium được dùng để sự kiện từ bàn phím và chuột. Vì vậy để mở 1 tab mới, chúng ta phải mô phỏng sự kiện nhấn phím Ctrl + t. Sau khi đã mở tab mới, chúng ta cần phải chuyển focus qua tab mới này, nếu không thì web driver sẽ chỉ thao tác lệnh trên tab hiện tại mà thôi

//Launch the first URL
driver.get("http://www.google.com");
//Use robot class to press Ctrl+t keys     
Robot robot = new Robot();                          
robot.keyPress(KeyEvent.VK_CONTROL); 
robot.keyPress(KeyEvent.VK_T); 
robot.keyRelease(KeyEvent.VK_CONTROL); 
robot.keyRelease(KeyEvent.VK_T);
//Switch focus to new tab
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
//Launch URL in the new tab
driver.get("http://google.com");


Cookies trong Selenium WebDriver

Cookies trong Selenium WebDriver



Cookies là gì?

Cookies là các tập tin được lưu trữ trên máy tính của bạn, nó bao gồm các thông tin của các trang web mà bạn truy cập. Cookies đươc sử dụng để duy trì thông tin trạng thái khi bạn truy cập vào các trang khác nhau trên một website, giúp bạn ghi nhớ các thông tin như đăng ký, đăng nhập, hoặc những thông tin mà bạn đã cung cấp khi truy cập trang web đó.

Cookies lưu trữ thông tin theo các cặp giá trị ‘key-value’. Những thông tin này sẽ được gửi tới trang web, các page tương ứng của trang web đó vào lần tiếp theo bạn truy cập.

Tại sao cần xử lý Cookies trong automation?

Trong quá trình thực hiện automation, bạn có thể cân nhắc xử lý cookies nếu bạn có một số vấn đề như dưới đây nhé:

1. Trong kịch bản kiểm thử của chúng ta có các yêu cầu đặc biệt nào đó liên quan đến cookies mà cần phải automate, và yêu cầu cần phải validate các giá trị đầu vào của các file cookie.

2. Vì cookie lưu các thông tin đăng nhập của người dùng khi ta đăng nhập vào một website nào đó, do vậy ta có thể tạo và load các file cookies trong quá trình automation. Từ đó có thể bỏ qua một số kịch bản, hoặc một số bước đã được xử lý bởi cookies, giúp ta giảm thiểu thời gian trong việc execute các test case.

Ví dụ đơn giản như này cho dễ hình dung, như chức năng đăng nhập của Google, ta chỉ cần đăng nhập 1 lần, sau đó khi vào các ứng dụng khác của google thì vì cookie đã lưu thông tin của ta rồi, nên ta không cần phải thực hiện đăng nhập tiếp thể có thể truy cập các ứng dụng khác ấy nữa.

Một số method thường dùng với Cookies:

1. Get Cookies

Có hai cách giúp bạn thực hiện get Cookies như sau:

  • getCookieNamed(String cookieName) – Lấy ra một Cookies cụ thể theo name của cookies.
  • getCookies() – Lấy ra tất cả Cookies trong domain hiện tại.
//To fetch a Cookie by name
System.out.println(driver.manage().getCookieNamed(cookieName).getValue());

//To return all the cookies of the current domain
Set<Cookie> cookiesForCurrentURL = driver.manage().getCookies();
for (Cookie cookie : cookiesForCurrentURL) {
    System.out.println(" Cookie Name - " + cookie.getName() 
			+ " Cookie Value - "  + cookie.getValue()));
}

2. Add Cookies

  • addCookie(Cookie cookie) – Được sử dụng để add một Cookies cụ thể nào đó vào trong các cookies.
Cookie cookie = new Cookie("cookieName", "cookieValue");
driver.manage().addCookie(cookie);

3. Delete cookies

Với trường hợp xóa cookies, ta có ba cách như dưới đây:

  • deleteCookieNamed(String cookieName) – Xóa một cookie cụ thể nào đó dựa theo name của cookie.
  • deleteCookie(Cookie cookie) – Xóa một cookie ra khỏi cookie jar của trình duyệt, method này sẽ bỏ qua domain của cookie đó.
  • deleteAllCookies() – Method này dùng để xóa tất cả cookies trong domain hiện tại.
//Delete a particular Cookie by name
driver.manage().deleteCookieNamed(cookieName);

//Delete a particular Cookie
driver.manage().deleteCookie(cookie);

//Delete all the Cookies
driver.manage().deleteAllCookies();

Đối với từng yêu cầu trong các trường hợp kịch bản kiểm thử cụ thể bạn có thể sử dụng các method tương ứng. Ngoài ra, các bạn có thể tham khảo các link dưới đây để tìm hiểu chi tiết và cụ thể hơn các ví dụ trong đó nhé, bao gồm cả code tham khảo đó.

Bài viết này nội dung hơn ngắn chút, nhưng mà cũng vi vọng là nó sẽ giúp ích trong việc nắm vững được khung kiến thức cơ bản liên quan đến cookie này. Vì thực tế thì mình mới dùng đến các trường hợp delele cookie thôi ah.

Full code demo: 

import java.io.IOException;
import java.util.Set;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxOptions;

public class Cookies {
       public static void main(String[] args) throws IOException {

            System.setProperty("webdriver.gecko.driver", "E:\\Program\\Firefox\\geckodriver.exe");
            FirefoxOptions options = new FirefoxOptions();
            options.setBinary("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
            FirefoxDriver driver = new FirefoxDriver(options);
            driver.get("http://flipkart.com/");
            // we should pass name and value for cookie as parameters
            // In this example we are passing, name=mycookie and value=123456789123          
            Cookie name = new Cookie("mycookie", "123456789123");
            //Add cookie
            driver.manage().addCookie(name);
            // After adding the cookie we will check that by displaying all the cookies.
            Set<Cookie> cookiesList = driver.manage().getCookies();
            for (Cookie getcookies : cookiesList) {
                 System.out.println(getcookies);
             }                             
             /*
              //To delete cookie with cookieName = "__utmb"
              driver.manage().deleteCookieNamed("__utmb");
              //To delete all cookies
               driver.manage().deleteAllCookies();
                */                          
             }
}


Các kiểu Wait trong Selenium Webdriver

 Các kiểu Wait trong Selenium Webdriver


Trong Selenium – Wait là một yếu tố đóng vai trò rất quan trọng khi thực thi các test case. Vì thế hôm nay trong bài viết này mình sẽ nói về một vài kiểu wait được nhắc đến khá nhiều trong Selenium Webdriver

Tại sao cần sử dụng Wait?

Đã bao giờ bạn viết script automation test, bạn đã chắc chắn là các key như bạn đã get như id/name chính xác hết rồi, mà khi run script vẫn báo fail và console vẫn in ra exception: ElementNotVisibleException“. Nguyên nhân là do script của bạn cứ đi tìm phần tử web ấy, trong khi trang web nó chưa tải được xong, lúc này thì tất nhiên là nó không thể tìm được phần tử web kia rồi. 

Ngoài ra nó còn vì một số nguyên nhân chính khác liên quan đến việc xử lý các phần tử web, Ajax và Javascript ở phía ứng dụng web, nên việc load các phần tử không thể diễn ra cùng một lúc được.

Để giải quyết vấn đề này, lời khuyên dành cho bạn là hãy sử dụng Waits.

Selenium waits bao gồm một số loại như:Implicit wait; Explicit wait; Fluent wait

Implicit wait

Sử dụng implicit wait khi run test script, nó sẽ yêu cầu web driver tạm dừng một khoảng thời gian nhất định mà mình đã thiết lập ban đầu, trước khi throw ra một exception có nội dung giống như này: “No Such Element Exception”.

Ví dụ đơn giản như sau, khi run 1 test script, trình duyệt được bật lên, đường dẫn ứng dụng được mở ra, theo tiến trình script sẽ tự động dừng lại 5 giây – do trước đó ta đã set implicit wait = 5 giây, rồi sau đó mới thực hiện tiếp thao tác tiếp theo là click vào login. Thay vì trước đây nếu không sử dụng wait, sau khi mở link, script sẽ run luôn bước tiếp theo là click vào nút login, và ở đoạn này có thể xảy ra trường hợp là code chạy nhanh quá, nút login chưa kịp hiển thị thì sẽ không tìm thấy element này để click, vì vậy sẽ có exception được trả về thôi.

Giá trị mặc định của khoảng thời gian này là 0. Ta có thể set các giá trị này tùy ý.

Cú pháp:

driver.manage().timeouts().
                     implicitlyWait(TimeOut, TimeUnit.SECONDS);

Ta có ví dụ:

driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);


package anhtester.com.testcode;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;

import java.util.concurrent.TimeUnit;

public class TestWait {

    WebDriver driver;

    @Test(priority = 1)
    public void ImplicitWaitDemo() throws InterruptedException {

        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
        System.out.println("Created Driver");
        driver.manage().window().maximize();

        //Set timeout
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

        driver.get("https://demo.abc.com/");

        driver.findElement(By.id("iusername")).sendKeys("admin01");
        driver.findElement(By.id("ipassword")).sendKeys("123456");
        driver.findElement(By.xpath("//button[@type='submit']")).click();

        //Click menu dự án
        driver.findElement(By.xpath("//span[contains(text(),'Dự án')]")).click();

        Thread.sleep(2000);
        driver.quit();
    }
}

Như ví dụ trên, thì ta set thời gian chờ trước khi bật ra expeption là 10 giây, chỗ TimeUnit, bạn có thể thay đổi thành SECONDS, MINUTES, MILISECOND, MICROSECONDS, NANOSECONDS, DAYS, HOURS,… tùy theo yêu cầu của bạn.

Explicit Wait

Khác với implicit wait, khi sử dụng explicit wait nó sẽ đi kèm với một điều kiện nào đó, tức là thay vì chờ đợi một khoảng thời gian được thiết lập sẵn thì ở đây chúng sẽ chờ một điều kiện cụ thể nào đó hay kiểm tra khi việc wait đã vượt qua khoảng thời gian maximum nào đó, trước khi output ra một exception có nội dung kiểu như là “ElementNotVisibleException”.

Ví dụ như là wait cho đến khi phần tử A có thể click được, hay phần tử B được enable, hoặc visible. Trong khi bình thường, nếu không sử dụng explicit wait, thì mặc dù phần tử A chưa click được, nhưng script của mình vẫn chạy, chưa click được nhưng cố click thì tất nhiên là ra exception thôi.

Đây được đánh giá là một kiểu wait rất là thông minh, nhưng nó chỉ có thể sử dụng được cho một số các element cụ thể nào đó thôi kiểu như trong trường hợp clickable, visible, invisible, display… . Và nó khá phù hợp trong những case mà có element động được load bằng Ajax.

Có 2 lưu ý khi các bạn dùng cả Explicit Wait và Implicit Wait
    - Nếu Explicit Wait dùng câu lệnh tìm kiếm là đối tượng By thì Explicit Wait sẽ được ưu tiên đầu tiên.
    -Nếu Explicit Wait dùng câu lệnh tìm kiếm là findElement thì Implicit Wait sẽ được ưu tiên đầu tiên.

Để sử dụng explicit wait thì có nhiều cách khác nhau, nhưng mình thì thích cách viết luôn cái này thành một method, và để nó vào một common nào đó, khi nào cần thì chỉ cần gọi ra và dùng thôi:

public void waitForElement(int seconds, String waitConditionLocator){
    WebDriverWait wait = new WebDriverWait(driver, seconds);
    wait.until(ExpectedConditions.visibilityOfElementLocated
              (By.xpath(waitConditionLocator)));
}

Bạn cũng có thể sử dụng trực tiếp như ví dụ dưới đây:

WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
                        .until(ExpectedConditions.presenceOfElementLocated
                        (By.id("myDynamicElement")));

Thêm ví dụ với điều kiện là element có thể click được hay display và enable như sau:

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable
                     (By.id("idOfElementToBeClicked")));

Ngoài ra các bạn có thể tham khảo thêm một số ví dụ khác:

elementToBeClickable() – Điều kiện mong đợi là chờ một phần tử có thể click được, tức là phần tử đó phải hiện diện / được hiển thị trên màn hình và phải enabled (có thể click).

wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[contains(text(),'Automation Testing')]")));
Java

 
textToBePresentInElement()
 – Điều kiện mong đợi là chờ một phần tử chứa đoạn text được chỉ định.

wait.until(ExpectedConditions.textToBePresentInElement(By.xpath("//div[@id= 'forgotPass'"), "text to be found"));
Java


alertIsPresent()
 – Điều kiện mong đợi là chờ một hộp cảnh báo xuất hiện.

wait.until(ExpectedConditions.alertIsPresent()) !=null);
Java


titleIs()
 – Điều kiện mong đợi là chờ một trang có tiêu đề cụ thể.

wait.until(ExpectedConditions.titleIs("Automation Testing"));
Java


frameToBeAvailableAndSwitchToIt()
 – Điều kiện mong đợi là chờ một khung có sẵn (available) và ngay sau khi có khung, điều khiển sẽ tự động chuyển sang nó.

wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("newframe")));
Java


visibilityOfElementLocated()
 - được sử dụng để kiểm tra xem một phần tử có trên DOM của một trang và hiển thị hay không. Có nghĩa là nó sử dụng đối tượng By thay vì đối tượng WebElement với chức năng có thể gọi để tìm phần tử đó trước rồi kiểm tra phần tử đó có hiển thị hay không.

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//h3[contains(text(),'Website Testing')]")));
		
driver.findElement(By.xpath("//h3[contains(text(),'Website Testing')]")).click();
Java


visibilityOf() - được sử dụng để kiểm tra xem một phần tử hiện diện trên DOM của một trang có hiển thị hay không. Có nghĩa là bạn đã tìm thấy Element đó rồi và chỉ kiểm tra nó có hiển thị hay chưa. Nên tham số nó kiểm tra là 1 đối tượng WebElement chứ không phải đối tượng By.

wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("//h3[contains(text(),'Website Testing')]"))));
		
driver.findElement(By.xpath("//h3[contains(text(),'Website Testing')]")).click();


Fluent wait

Sử dụng Fluent wait trong những trường hợp kiểu như, đôi khi là ta gặp những phần tử mà cần từ một đến hai giây để load, nhưng khi khác có khi lại cần nhiều thời gian hơn đến tận mấy chục giây chẳng hạn. Fluent wait sẽ tìm kiếm đi tìm kiếm lại cho đến khi tìm được phần tử đó hoặc đến khi time out thì thôi.

Ví dụ khi dùng Fluent wait, nó sẽ chờ phần tử A một khoảng thời gian cho đến khi nó xuất hiện, trong mỗi khoảng thời gian nào đó nó lại thực hiện kiểm tra xem phần tử này đã xuất hiện chưa, nếu chưa thì qua khoảng thời gian đó nó lại check lại, nếu đã tìm được thì nó sẽ đi bước tiếp theo. Hoặc đến khi vượt quá khoảng thời gian time out đã set thì lúc này mới bật ra exception.

Ta có cú pháp như sau:

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(timeout, SECONDS)
.pollingEvery(timeout, SECONDS)
.ignoring(Exception.class);

Các bạn có thể tham khảo ví dụ dưới đây nhé:

// Sẽ chờ 30 giây để mỗi element hiển thị trên page 
// và sẽ thực hiện lặp lại mỗi 5 giây nếu chưa tìm thấy phần tử đó
 
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
 .withTimeout(30, SECONDS)
 .pollingEvery(5, SECONDS)
 .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() 
{
 public WebElement apply(WebDriver driver) {
 return driver.findElement(By.id("foo"));
}
});


Screenshots trong Selenium WebDriver

 Screenshots trong Selenium WebDriver


Khi testing, bên manual chúng ta thường hay chụp màn hình để làm evidence cho kết quả test. Vậy bên automation thì chúng ta làm thế nào để chụp màn hình những chỗ bị fail. Bài hôm nay sẽ giải đáp cho các bạn.

Làm thế nào để chụp màn hình?

Trong Selenium có một interface gọi là TakesScreenshot. Trong interface này có method hỗ trợ việc chụp màn hình, nó chính là getScreenshotAs

File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("D:\\testScreenShot.jpg"));

Cách chụp màn hình chỉ cho những test step bị fail

Để chụp màn hình ở những chỗ bị fail. Trong @AfterMethod annotation, chúng ta sử dụng phương thức getStatus() của ITestResult interface. Phương thức này sẽ trả về kết quả test, chúng ta sẽ dựa vào điều này để chụp màn hình.

@AfterMethod 
public void takeScreenShotOnFailure(ITestResult testResult) throws IOException { 
	if (testResult.getStatus() == ITestResult.FAILURE) { 
		File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 
		FileUtils.copyFile(scrFile, new File("errorScreenshots\\" + testResult.getName() + "-" 
				+ Arrays.toString(testResult.getParameters()) +  ".jpg"));
	} 
}

Full code demo

public class ScreenshotDemo{
	String driverExecutablePath = "lib\\chromedriver.exe";
	WebDriver driver;
	
	@BeforeTest
	public void setup(){
		System.setProperty("webdriver.chrome.driver", driverExecutablePath);
		driver = new ChromeDriver();
		
		//Set implicit wait of 3 seconds
		driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
	}
	
	
	@Test
	//Tests google calculator
	public void googleCalculator() throws IOException{
		
		//Launch google
		driver.get("http://www.google.co.in");
		
		//Write 2+2 in google textbox
		WebElement googleTextBox = driver.findElement(By.id("lst-ib"));
		googleTextBox.sendKeys("2+2");
		
		//Hit enter
		googleTextBox.sendKeys(Keys.ENTER);
		
		//Get result from calculator
		WebElement calculatorTextBox = driver.findElement(By.id("cwtltblr"));
		String result = calculatorTextBox.getText();
		
		//Intentionaly checking for wrong calculation of 2+2=5 in order to take screenshot for failing test
		Assert.assertEquals(result, "5");
	}
		
	@AfterMethod
	public void takeScreenShotOnFailure(ITestResult testResult) throws IOException {
		if (testResult.getStatus() == ITestResult.FAILURE) {
			System.out.println(testResult.getStatus());
			File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
			FileUtils.copyFile(scrFile, new File("errorScreenshots\\" + testResult.getName() + "-" 
					+ Arrays.toString(testResult.getParameters()) +  ".jpg"));
	   }        
	}
	
}