[Bài 14] Sử dụng Dummy Data vào trong TestCase và Fix trường hợp Unable to locate element

LƯU Ý: Do mình các class càng ngày càng dài, nên mình chỉ viết những đoạn thay đổi, đoạn nào như cũ, mình sẽ thay thế bằng dấu “…”

I. Sử dụng Dummy data vào trong TestCase

bài trước, ta đã viết được Class Generator để tạo dummy data. Và ta sẽ sử dụng dummy data trong nhiều testcase nên tốt nhất là ta sẽ bắt đầu sử dụng nó ở BeforeMethod ở Class BaseTest. Đây là 1 cách:

public class BaseTest {

	...
	Generator gen;
	String title, body;
	
	@BeforeMethod
	public void setUp() {
		...
		gen = new Generator();
		title = gen.title();
		body = gen.body();
		
	}
}

Sau đó ở Class AddNewPostTest, ta chỉ cần thay thế data cũ.

public class AddNewPostTest extends BaseTest {
	....

	@Test
	public void addNewPost() {
                ...
		addNewPg.addANewPost(title, body);
		addNewPg.goToDetailPage();

		String titlePost = driver.findElement(By.tagName("h1")).getText();
		Assert.assertEquals(titlePost, title);
	}

II. Fix trường hợp Unable to locate element

Sau đó, ta có thể run lại Test để xem mình viết đã đúng hay chưa. Và đây là kết quả sau khi run test.

Ơ, sao cái này mình chạy bình thường đâu có sao nhỉ? sao lại bị thế. 🙁

Sau vài lần chạy mà vẫn bị lỗi cũ. Mình quyết định debug (mình sẽ viết một bài về hướng dẫn debug sau), khi debug thì mình thấy nó run ngon, chả vấn đề gì cả. Sau đó, mình lại run và hi vọng sẽ ok –> vẫn lỗi.

Đến đây, mình giống như bao nhiêu bạn, nghĩ là nên add Wait vì có thể nó là do cái element đó chưa hiện ra nên ko locate được. OK, add 1 cái implicit Wait ở BeforeMethod.

@BeforeMethod
public void setUp() {
	...
	driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}

Run lại và testcase của mình run chậm hơn rất nhiều và vẫn bị lỗi cũ (một bạn đã hỏi mình ở bài 11). Mình quyết định manual run lại và quan sát thật kỹ để xem lỗi là gì và mình đã phát hiện ra vấn đề:

WordPress tạo ra Permalink sau khi điền title, khi điền data tự động, nó đã insert nhanh quá, nên chưa kịp tạo ra Permalink thì đã click vào button Pushlish –> click không có tác dụng –> ko tạo được post mới –> không xuất hiện “View post” –> gây ra lỗi “Unable to locate element: #message a”

1. Add 1 Thread.sleep()

Ở vị trí trước khi back về defaultContent ở method addANewPost trong class AddNewPostPage:

public void addANewPost(String title, String body) throws InterruptedException {
	...
	Thread.sleep(2000);
	driver.switchTo().defaultContent();
	publishBtn.click();
}

Lưu ý: khi add Thread.sleep() thì nó có thể xảy ra exception nên phải “throws InterruptedException” ở tất cả các method mà gọi đến nó –> sửa cả Testcase mà gọi đến method này.

@Test
public void addNewPost() throws InterruptedException {
       ...
}

Tuy nhiên, đây là cách mang lại Exception và sự không ổn định, nên tốt nhất là KHÔNG sử dụng nó.

2. Sử dụng ExplicitWait

Ta sẽ đợi cho đến khi cái Permalink xuất hiện thì mới click vào button Publish. Ta thấy là việc đợi cho 1 cái Element xuất hiện thì hầu như chỗ nào cũng dùng nên tốt nhất là ta nên viết cái đó ở BasePage, nhưng vì hiện tại ta chưa viết Class đó nên ta tạm implement ExplicitWait vào function addANewPost.

public class AddNewPostPage {

	...
	WebDriverWait wait;

	public AddNewPostPage(WebDriver driver) {
		this.driver = driver;
		wait = new WebDriverWait(driver, 20);
	}

	public void addANewPost(String title, String body) {
		...
		wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.cssSelector("#edit-slug-box > strong"))));
		publishBtn.click();
	}

}

Sau đó, ta run lại vài lần –> xanh rồi, mừng quá. ^^

0 0 votes
Article Rating
Subscribe
Notify of
guest
2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
trackback

[…] ← Previous Next → […]

trackback

[…] hoàn toàn có thể dùng WeDriverWait cùng với Page Object, đọc thêm bài 14 basic để biết cách implement. Selenium đã viết rất nhiều các condition khác nhau, thoải […]