Tổng hợp một số cách mở 1 link trong tab mới với Selenium Webdriver

Bài viết được sự cho phép của tác giả Tô Thị Vân Anh

Trong bài viết này chúng ta sẽ cùng nhau xem lại một vài cách để thực hiện mở 1 link trong tab mới, trong tiếng anh là “Open a link in new tab”, quá quen thuộc khi mà chúng ta nhấn chuột phải ở trang web đang làm việc để mở đường dẫn trong một tab khác. Và vì thế nên là mình sẽ đi vào giải quyết vấn đề luôn mà không nói lan man nữa. 😀

  JavaScript Executor trong Selenium Webdriver
  Selenium là gì? Một số kinh nghiệm làm việc với Selenium

1.  Sử dụng javascript với cú pháp như sau:

((JavascriptExecutor) driver).executeScript
                   ("window.open('http://accounts.google.com/','_blank');");

Muốn mở đến đường dẫn nào thì bạn chỉ cần thay đường link trên bằng 1 đường dẫn tương ứng khác là được. Nhưng mà cái này sẽ gặp vấn đề khi chạy với trình duyệt IE – IE nó sẽ hiện một dòng hỏi bạn là có muốn mở tab khác hay không, nên là sẽ không tiện nếu như mà dùng cách này với IE. :3

2. Sử dụng cách dưới này 😀

Cú pháp như sau:

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN);
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);

Hoặc tách bước ở dòng thứ 2 ra như này thì sẽ sáng sủa hơn:

WebElement urlLink = driver.findElement(By.linkText("Overview"));
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN);  
urlLink.sendKeys(selectLinkOpeninNewTab);

Với cách này thì chạy ok với trình duyệt Firefox, Chrome nhưng không focus vào tab mới mở ra – còn trên trình duyệt IE thì bật ra cửa sổ mới – cũng “don’t know why!” 😀

Để nó focus sang cửa sổ mới thì các bạn thêm đoạn code phía dưới này vào, và chúng ta có được đoạn code đầy đủ như này nhé:

//Linktext của đường dẫn mới
WebElement urlLink = driver.findElement(By.linkText("Overview")); 

//Mở đường dẫn mới ở một tab mới
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN); 
urlLink.sendKeys(selectLinkOpeninNewTab);

//Focus sang tab mới
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles()); 
driver.switchTo().window(tabs.get(1));

3. Sử dụng robot class:

Như chúng ta đều đã nghe nói đến Robot class trong Selenium rồi, đơn giản dễ hiểu thì robot được sử dụng để giả lập các sự kiện liên quan đến thao tác trên bàn phím, hay các thao tác click của chuột, nên là với trường hợp này ở đây, ta có thể tưởng tượng như đang làm bằng tay và giả lập cho code của chúng ta cũng sẽ làm như vậy nhờ Robot. Đầu tiên nhấn Control + t để mở tab mới, sau khi tab mới được mở ra thì ta sẽ chuyển focus chuột vào tab mới này và mở link mới ở tab đó thôi.

Các bạn có thể tham khảo đoạn code phía dưới để hình dung rõ hơn nhé! Ban đầu dùng đoạn code dưới này để chạy thì nó chỉ chạy được đến bước là mở tab mới có focus vào tab mới này, nhưng không thể nào mở được cái link mới, không thể hiểu tại sao dù đã google tìm rất nhiều thì code cũng chỉ có vậy – vấn đề đối với cả FF và Chrome. :3

Chạy đi chạy lại nhiều lần, bỗng dưng vẫn đoạn code đó thì Chrome lại được, và mình nhanh chóng thử lại với FF thì lại không được, vẫn chết đoạn get(index), quay lại với Chrome thì lại không chạy được nữa, lúc này mới nhớ ra nhét thử sleep() vào, thì lại ngon lành cho cả hai! 😀 – Không thể tin được =))

//Ra lệnh cho rô-bốt mở tab mới      
Robot r = new Robot();                           
r.keyPress(KeyEvent.VK_CONTROL);  
r.keyPress(KeyEvent.VK_T);  
r.keyRelease(KeyEvent.VK_CONTROL);  
r.keyRelease(KeyEvent.VK_T);  
   
//Đoạn này để nhảy sang tab mới 
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles()); 
driver.switchTo().window(tabs.get(1)); 

//Sleep thần thánh
Thread.sleep(2000);

//Mở link mới trên tab mới
driver.get("https://jmeter.apache.org/usermanual/index.html");

4.    Sử dụng class Action

Mình đã test trên IE11, FF58,59 và Chrome 66 , với FF, Chrome thì không chạy được, mà đối với IE thì nó lại mở ra một cửa sổ mới, không hiểu tại sao. :3

Dưới đây là đoạn code các bạn có thể tham khảo và góp ý cho mình:

WebElement link = driver.findElement(By.linkText("Installing Apache JMeter in Windows XP"));
Actions act = new Actions(driver);
act.contextClick(link).sendKeys(Keys.ARROW_DOWN).
                       sendKeys(Keys.ARROW_DOWN).
                       sendKeys(Keys.ENTER).build().perform();

5. Bonus thêm 1 cách khác – cách này thì chạy ngon…

Đầu tiên sử dụng Javaexecutor để mở 1 tab trống mới,

((JavascriptExecutor)driver).
executeScript(“window.open(‘about:blank’, ‘-blank’)”);

Sau đó, thực hiện nhảy sang tab mới với cú pháp:

 ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
 driver.switchTo().window(tabs.get(1));

Và cuối cùng là dán cái link mới vào cái tab này là được:

driver.get("https://jmeter.apache.org/usermanual/index.html");

Và trên đây là những cách mà mình đã đào bới được trên google, phát hiện ra là những cái này khá là phụ thuộc vào trình duyệt mà chúng ta sử dụng vì thế các bạn có thể linh động với trình duyệt để lựa chọn các cách cho phù hợp nhé!

Bài viết tham khảo và tổng hợp từ tè le các nguồn thu thập được trên internet điển hình là từ stackoverflow và nhiều trang khác nữa 😀

Bài viết gốc được đăng tải tại vananhtooo.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm Developer hấp dẫn trên TopDev