2012-08-14 33 views
26

Tôi có HTML sau:Làm thế nào để bấm một yếu tố trong Selenium WebDriver sử dụng JavaScript

<button name="btnG" class="gbqfb" aria-label="Google Search" id="gbqfb"><span class="gbqfi"></span></button> 

mã sau tôi đã nhấp vào "Google Search" nút đang làm việc cũng sử dụng Java trong WebDriver.

driver.findElement(By.id("gbqfb")).click(); 

Tôi muốn sử dụng JavaScript với WebDriver để nhấp vào nút. Tôi làm nó như thế nào?

+0

Tôi không nhận được nó - bạn muốn '.click() 'để bắn javascript chức năng binded đến đó nút? Hoặc bạn có cần một cái gì đó như http://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions#Q:_How_do_I_execute_Javascript_directly? – WTK

Trả lời

67

Thực hiện nhấp qua JavaScript có một số hành vi bạn cần biết. Ví dụ: nếu mã được liên kết với sự kiện onclick của phần tử của bạn gọi số window.alert(), bạn có thể thấy mã Selenium của mình treo, tùy thuộc vào việc triển khai trình điều khiển trình duyệt. Điều đó nói rằng, bạn có thể sử dụng lớp JavascriptExecutor để làm điều này. Giải pháp của tôi khác với những người khác được đề xuất, tuy nhiên, trong đó bạn vẫn có thể sử dụng các phương pháp WebDriver để định vị các phần tử.

// Assume driver is a valid WebDriver instance that 
// has been properly instantiated elsewhere. 
WebElement element = driver.findElement(By.id("gbqfd")); 
JavascriptExecutor executor = (JavascriptExecutor)driver; 
executor.executeScript("arguments[0].click();", element); 

Bạn cũng nên lưu ý rằng bạn có thể được tốt hơn bằng cách sử dụng phương pháp click() của giao diện WebElement, nhưng disabling native events trước instantiating lái xe của bạn. Điều này sẽ hoàn thành cùng một mục tiêu (với cùng các giới hạn tiềm năng), nhưng không bắt buộc bạn viết và duy trì JavaScript của riêng bạn.

+0

Tôi có thể biết tại sao 'đối số [0] .click();'? Làm thế nào để bạn biết nó là chỉ số 0? – huahsin68

+4

Vì bạn đang chuyển tham chiếu phần tử làm đối số thứ 0 trong lệnh gọi 'executeScript'. – JimEvans

+0

Cảm ơn vì điều này, chỉ cần dành toàn bộ buổi sáng tìm kiếm một giải pháp tốt và điều này hoạt động như một sự quyến rũ. –

5

Đây là đoạn mã sử dụng JavaScript để nhấp vào nút ở WebDriver:

WebDriver driver = new FirefoxDriver(); 
JavascriptExecutor jse = (JavascriptExecutor)driver; 
jse.executeScript("document.getElementById('gbqfb').click();"); 
+0

Có 6 người đã bỏ phiếu cho câu trả lời, nhưng nó không hoạt động đối với tôi.Đặt 'Đây không phải là một hàm ...' ngoại lệ. Thậm chí không thể thực thi kịch bản trên bàn điều khiển, không được có dấu chấm phẩy sau khi 'click()'. –

+1

Điều này phù hợp với tôi. Có ngoại lệ tôi đã nhận được là bởi vì các trang HTML không được tải hoàn toàn, tôi đặt nhiều thời gian hơn vào 'Thread.Sleep();' sau đó nó làm việc cho tôi.Thanks –

+0

Nó sẽ làm việc khi chúng tôi có "id" như định vị. Nếu tôi có xpath làm định vị thì sao? –

2

Bạn không thể sử dụng WebDriver để làm điều đó trong JavaScript, như WebDriver là một công cụ Java. Tuy nhiên, bạn có thể thực thi JavaScript từ Java bằng cách sử dụng WebDriver và bạn có thể gọi một số mã JavaScript mà nhấp vào một nút cụ thể.

WebDriver driver; // Assigned elsewhere 
JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript("window.document.getElementById('gbqfb').click()"); 
+0

Có thể sử dụng WebDriver mà không có instantiation không? đối tượng trình điều khiển phải được khởi tạo là driver = new FirefoxDriver(); Chỉ tuyên bố là không đủ. –

+0

Có thực sự: Tôi đã chọn không thêm instantiation (do đó bình luận) bởi vì bạn có thể muốn khởi tạo một trình điều khiển từ các trình duyệt khác nhau. – Stilltorik

2

Tôi biết đây không phải là JavaScript, nhưng bạn cũng có thể thể chất sử dụng chuột-nhấp chuột để bấm vào một Javascript neo động:

public static void mouseClickByLocator(String cssLocator) { 
    String locator = cssLocator; 
    WebElement el = driver.findElement(By.cssSelector(locator)); 
    Actions builder = new Actions(driver); 
    builder.moveToElement(el).click(el); 
    builder.perform(); 
} 
1

Không chắc câu trả lời OP đã thực sự trả lời.

var driver = new webdriver.Builder().usingServer('serverAddress').withCapabilities({'browserName': 'firefox'}).build(); 

driver.get('http://www.google.com'); 
driver.findElement(webdriver.By.id('gbqfb')).click(); 
-10

Chữ thập thử nghiệm trình duyệt java script

public class MultipleBrowser { 

    public WebDriver driver= null; 
    String browser="mozilla"; 
    String url="https://www.omnicard.com"; 

    @BeforeMethod 
    public void LaunchBrowser() { 

     if(browser.equalsIgnoreCase("mozilla")) 
      driver= new FirefoxDriver(); 
     else if(browser.equalsIgnoreCase("safari")) 
      driver= new SafariDriver(); 
     else if(browser.equalsIgnoreCase("chrome")) 
      //System.setProperty("webdriver.chrome.driver","/Users/mhossain/Desktop/chromedriver"); 
      driver= new ChromeDriver(); 
     driver.manage().timeouts().implicitlyWait(4, TimeUnit.SECONDS); 
     driver.navigate().to(url); 
    } 

} 

nhưng khi bạn muốn chạy firefox bạn cần phải chrome con đường vô hiệu hóa, nếu không trình duyệt sẽ khởi động nhưng ứng dụng có thể không. (Thử cả hai chiều).

+4

Tại sao làm cho tiếng ồn ngẫu nhiên thay vì cố gắng trả lời câu hỏi? Tôi thấy loại hành vi này ở khắp mọi nơi trên stackoverflow. – nurettin

+0

Điều này không trả lời câu hỏi vì câu hỏi yêu cầu cách thực hiện từ bên trong JavaScript, chứ không phải Java. – cpburnz

0

Mã này sẽ thực hiện các hoạt động nhấp chuột trên WebElement "chúng ta" sau 100 ms:

WebDriver driver = new FirefoxDriver(); 
JavascriptExecutor jse = (JavascriptExecutor)driver; 

jse.executeScript("var elem=arguments[0]; setTimeout(function() {elem.click();}, 100)", we); 
+1

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. [Từ đánh giá] (https://stackoverflow.com/review/low-quality-posts/15068687) – Ferrybig

+0

Mã này sẽ thực hiện thao tác nhấp trên WebElement "chúng tôi" sau (100/1000) giây. – hemanto

+0

Tôi muốn biết tại sao ai đó sẽ downvote câu trả lời này. – hemanto

Các vấn đề liên quan