
Khi làm Automation Test, việc xác định đúng vị trí chính xác một element trên giao diện là bắt buộc trước khi tạo và chạy kịch bản test tự động.Trong Selenium nếu không thể tìm kiếm các elements bởi các định vị như id, class, name… thì hoàn toàn có thể nghĩ tới xpath để tìm các elements đó trên web.
Đây là cách trực tiếp để tìm phần tử, nhưng nhược điểm của XPath tuyệt đối là nếu có bất kỳ thay đổi nào được thực hiện trong đường dẫn của phần tử thì XPath sẽ bị lỗi.
Đặc điểm chính của XPath là nó bắt đầu bằng dấu gạch chéo đơn (/), có nghĩa là bạn có thể chọn phần tử từ nút gốc.
VD: /html/body/div/div/header/div/div[4]/form/div[1]/input
Đối với Xpath tương đối, đường dẫn bắt đầu từ giữa cấu trúc DOM HTML. Nó bắt đầu bằng dấu gạch chéo kép (//), có nghĩa là nó có thể tìm kiếm phần tử ở bất kỳ đâu trên trang web.
VD://input[@id='search']
VD: 1. //input[@id='email'] 2. //input[@title='Email Address'] 3. //input[@name='login[username]']
Priority
Khi không thể định danh được element bằng các thẻ và attribute của nó:
//parent-tagname[@attribute=‘value’]//child-tagname[@attribute=‘value’]
VD: 1. //div[@class='footer']//a[@title='Site Map'] 2. //div[@class='footer-container']//a[@title='Site Map']
VD: //div[@class'footer']//a[text()='Site Map'] (chạy nhanh hơn vì nó quét phạm vi hẹp)
VD: //div[@class='footer-container']//a[@title='Site Map']
VD: //div[@class='footer-container']//a[contains(text(),'Site Map')]
VD: 1. //div[@class='footer-container']//a[starts-with(text(),'Site Map')] 2. //div[@class='footer-container']//a[@starts-with(@title,'Site Map')]
1. text()=’…’
2. contains(text(),’…‘)
3. contains(.,’…‘)
4. contains(string(),’…‘)
5. concat()
package webdriver; import java.util.Random; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class Topic_02_Xpath_Css_PartII { WebDriver driver; private int randomInt; @BeforeClass public void beforeClass() { driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); driver.manage().window().maximize(); } @Test public void Login_01_Empty_Email_And_Password() { driver.get("http://live.demoguru99.com/"); driver.findElement(By.xpath("//div[@class='footer']//a[@title='My Account']")).click(); driver.findElement(By.xpath("//*[@id='email']")).sendKeys(""); driver.findElement(By.xpath("//*[@id='pass']")).sendKeys(""); driver.findElement(By.xpath("//*[@id='send2']")).click(); Assert.assertEquals(driver.findElement(By.xpath("//*[@id='advice-required-entry-email']")).getText(), "This is a required field."); Assert.assertEquals(driver.findElement(By.xpath("//*[@id='advice-required-entry-pass']")).getText(), "This is a required field."); } @Test public void Login_02_Invalid_Email() { driver.get("http://live.demoguru99.com/"); driver.findElement(By.xpath("//div[@class='footer']//a[@title='My Account']")).click(); driver.findElement(By.xpath("//*[@id='email']")).sendKeys("123@2333"); driver.findElement(By.xpath("//*[@id='pass']")).sendKeys("123456"); driver.findElement(By.xpath("//*[@id='send2']")).click(); Assert.assertEquals(driver.findElement(By.xpath("//*[@id='advice-validate-email-email']")).getText(), "Please enter a valid email address. For example johndoe@domain.com."); } @Test public void Login_03_Invalid_Password_less6character() { driver.get("http://live.demoguru99.com/"); driver.findElement(By.xpath("//div[@class='footer']//a[@title='My Account']")).click(); driver.findElement(By.xpath("//*[@id='email']")).sendKeys("automation@gmail.com"); driver.findElement(By.xpath("//*[@id='pass']")).sendKeys("123"); driver.findElement(By.xpath("//*[@id='send2']")).click(); Assert.assertEquals(driver.findElement(By.xpath("//div[@id='advice-validate-password-pass']")).getText(), "Please enter 6 or more characters without leading or trailing spaces."); } @Test public void Login_04_Correct_Email_Incorrect_Password() { driver.get("http://live.demoguru99.com/"); driver.findElement(By.xpath("//div[@class='footer']//a[@title='My Account']")).click(); driver.findElement(By.xpath("//*[@id='email']")).sendKeys("automation@gmail.com"); driver.findElement(By.xpath("//*[@id='pass']")).sendKeys("123123123"); driver.findElement(By.xpath("//*[@id='send2']")).click(); Assert.assertEquals(driver.findElement(By.xpath("//li[@class='error-msg']//span")).getText(), "Invalid login or password."); } @Test public void Login_05_Create_A_New_Account() throws InterruptedException { driver.get("http://live.demoguru99.com/"); driver.findElement(By.xpath("//div[@class='footer']//a[@title='My Account']")).click(); Thread.sleep(3000); driver.findElement(By.xpath("//span[contains(text(),'Create an Account')]")).click(); driver.findElement(By.id("firstname")).clear(); driver.findElement(By.id("firstname")).sendKeys("Thu"); driver.findElement(By.id("lastname")).clear(); driver.findElement(By.id("lastname")).sendKeys("Giang"); // the new random number Random rd = new Random(); for (int idx = 1000; idx <= 100000; ++idx) { randomInt = rd.nextInt(100000); } driver.findElement(By.id("email_address")).clear(); driver.findElement(By.id("email_address")).sendKeys("thugiang.hvktqs" + randomInt + "@gmail.com"); driver.findElement(By.id("password")).clear(); driver.findElement(By.id("password")).sendKeys("thugiang1905"); driver.findElement(By.id("confirmation")).clear(); driver.findElement(By.id("confirmation")).sendKeys("thugiang1905"); driver.findElement(By.xpath("//div[@class='buttons-set']//button")).click(); Assert.assertEquals(driver.findElement(By.xpath("//li[@class='success-msg']//span")).getText(), "Thank you for registering with Main Website Store."); System.out.println(driver .findElement(By.xpath("//div[@class='box-content']//p[contains(text(),'Thu Giang')]//br")).getText()); driver.findElement(By.xpath("//div[@class='account-cart-wrapper']//span[@class='label']")).click(); driver.findElement(By.xpath("//a[@title='Log Out']")).click(); Assert.assertEquals(driver.findElement(By.xpath("//div[@class='page-title']//h2")).getText(), "THIS IS DEMO SITE FOR "); driver.findElement(By.xpath("//a[@class='skip-link skip-account']//span[@class='label']")).click(); driver.findElement(By.xpath("//div[@id='header-account']/div/ul/li[5]/a")).click(); } @Test public void Login_06_Correct_Email_Correct_Password() { driver.get("http://live.demoguru99.com/"); driver.findElement(By.xpath("//div[@class='footer']//a[@title='My Account']")).click(); driver.findElement(By.xpath("//input[@id='email']")).sendKeys("thugiang.hvktqs@gmail.com"); driver.findElement(By.xpath("//input[@id='pass']")).sendKeys("thugiang1905"); driver.findElement(By.xpath("//button[@id='send2']")).click(); // Verify the data registed Assert.assertEquals(driver.findElement(By.xpath("//div[@class='page-title']//h1")).getText(), "MY DASHBOARD"); Assert.assertEquals(driver.findElement(By.xpath("//div[@class='welcome-msg']//strong")).getText(), "Hello, Thu Giang!"); } @AfterClass public void afterClass() { driver.quit(); } }
Link tham khảo: