2012-06-28 28 views
11

Tôi đang cố gắng sử dụng Selenium WebDriver để nhập văn bản vào phần tử nhập GWT có văn bản mặc định, "Nhập ID người dùng". Dưới đây là một vài cách tôi đã cố gắng làm cho công việc này hoạt động:Tôi có thể xóa văn bản mặc định từ phần tử đầu vào bằng Selenium bằng cách nào?

 searchField.click(); 
     if(!searchField.getAttribute("value").isEmpty()) { 
      // clear field, if not already empty 
      searchField.clear(); 
     } 
     if(!searchField.getAttribute("value").isEmpty()) { 
      // if it still didn't clear, click away and click back 
      externalLinksHeader.click(); 
      searchField.click(); 
     } 

     searchField.sendKeys(username); 

Điều kỳ lạ ở trên chỉ hoạt động trong một khoảng thời gian. Đôi khi, nó kết thúc tìm kiếm "Nhập ID người dùng", về cơ bản bắt đầu nhập "tên người dùng" sau văn bản mặc định - và thậm chí không hoàn thành điều đó.

Bất kỳ cách nào tốt hơn, đáng tin cậy hơn để xóa văn bản mặc định khỏi phần tử GWT?

Đã chỉnh sửa để thêm: HTML của phần tử nhập. Thật không may, không có nhiều điều để xem, nhờ vào sự nóng bỏng JS/GWT. Đây là trường khi nó không được chọn:

<input type="text" class="gwt-TextBox empty" maxlength="40"> 

Sau khi tôi đã nhấp vào nó và đặt tiêu điểm theo cách thủ công, văn bản mặc định và lớp "trống" sẽ bị xóa.

JS đến setDefaultText() được gọi là cả onBlur()onChange() nếu thay đổi dẫn đến trường văn bản trống. Đoán đó là lý do tại sao searchField.clear() không giúp ích gì.

Tôi cũng đã thực hiện phương pháp này trong chế độ gỡ lỗi và trong trường hợp đó, nó không bao giờ hoạt động. Khi chạy bình thường, nó hoạt động phần lớn thời gian. Tôi không thể nói tại sao, mặc dù.

+1

Bạn có thể đăng bản sao HTML của kiểm soát và javascript có tương tác với điều khiển không? – Arran

+2

Văn bản mặc định trong 'đầu vào' có xuất phát từ thuộc tính HTML5 của' trình giữ chỗ 'hay có một số loại 'onfocus' và' onblur' JavaScript không? –

Trả lời

18

OK, tập lệnh rõ ràng sẽ khởi động khi phương pháp clear() xóa input và để trống. Các giải pháp nó đưa ra được đưa ra dưới đây.

  1. Người ngây thơ, nhấn Backspace 10 lần:

    String b = Keys.BACK_SPACE.toString(); 
    searchField.sendKeys(b+b+b+b+b+b+b+b+b+b + username); 
    

    (StringUtils.repeat() từ Apache Commons Lang hoặc Google ổi của Strings.repeat() có thể có ích)

  2. Người đẹp sử dụng Ctrl+A, Delete:

    String del = Keys.chord(Keys.CONTROL, "a") + Keys.DELETE; 
    searchField.sendKeys(del + username); 
    
  3. Xóa nội dung của input qua JavaScript:

    JavascriptExecutor js = (JavascriptExecutor)driver; 
    js.executeScript("arguments[0].value = '';", searchField); 
    searchField.sendKeys(username); 
    
  4. Thiết lập giá trị của input qua JavaScript hoàn toàn:

    JavascriptExecutor js = (JavascriptExecutor)driver; 
    js.executeScript("arguments[0].value = '" + username + "';", searchField); 
    

Lưu ý rằng javascript có thể không luôn luôn làm việc, như thể hiện ở đây : Why can't I clear an input field with javascript?

+1

Cảm ơn rất nhiều vì những ý tưởng. Tôi đã thử 2, hoạt động lần đầu tiên, nhưng khi tôi quay lại tìm kiếm người dùng thứ hai, chỉ xóa ký tự cuối cùng của tên người dùng đầu tiên. Rất kỳ quặc. Với giải pháp số 4, nút "Tìm" phải được nhấp để tìm kiếm không được kích hoạt, bởi vì không có nhấp chuột hoặc chỉnh sửa sự kiện. Giải pháp số 3 hoạt động hoàn hảo cho tôi. Cảm ơn! – mcole

+0

Huh. Tôi nghĩ rằng số 2 là một cược chắc chắn. Dù sao, tôi vui vì nó đã giúp! –

0

Đối với những gì tôi đáng giá, tôi gặp phải sự cố tương tự. WebDriver 2.28.0 và FireFox 18.0.1

Tôi cũng đang sử dụng GWT nhưng có thể tái tạo nó với HTML đơn giản/JS:

<html> 
<body> 
<div> 
<h3>Box one</h3> 
<input id="boxOne" type="text" onfocus="if (this.value == 'foo') this.value = '';" onblur="if (this.value == '') this.value = 'foo';"/> 
</div> 
<div> 
<h3>Box two</h3> 
<input id="boxTwo" type="text" /> 
</div> 
</body> 
</html> 

thử nghiệm này thất bại hầu hết thời gian:

@Test 
public void testTextFocusBlurDirect() throws Exception { 
    FirefoxDriver driver = new FirefoxDriver(); 

    driver.navigate().to(getClass().getResource("/TestTextFocusBlur.html")); 

    for (int i = 0; i < 200; i++) { 
     String magic = "test" + System.currentTimeMillis(); 
     driver.findElementById("boxOne").clear(); 
     Thread.sleep(100); 
     driver.findElementById("boxOne").sendKeys(magic); 
     Thread.sleep(100); 
     driver.findElementById("boxTwo").clear(); 
     Thread.sleep(100); 
     driver.findElementById("boxTwo").sendKeys("" + i); 
     Thread.sleep(100); 
     assertEquals(magic, driver.findElementById("boxOne").getAttribute("value")); 
    } 

    driver.quit(); 
} 

Nó chỉ có thể là lấy OS tập trung khỏi trình duyệt theo cách mà WebDriver không thể kiểm soát. Chúng tôi dường như không nhận được vấn đề này trên máy chủ CI để có thể đó là trường hợp.

0

Tôi chưa thể thêm nhận xét, vì vậy tôi đặt câu trả lời ở đây. Tôi muốn thông báo cho bạn rằng nếu bạn chỉ muốn sử dụng javascript để xóa và/hoặc chỉnh sửa trường văn bản nhập, thì cách tiếp cận javascript được cung cấp bởi @slanec sẽ không hoạt động. Dưới đây là ví dụ: Why can't I clear an input field with javascript?

0
In case you use c# then solution would be : 

// provide some text 
webElement.SendKeys("aa"); 
// this is how you use this in C# , VS 
String b = Keys.Backspace.ToString(); 

// then provide back space few times 
webElement.SendKeys(b + b + b + b + b + b + b + b + b + b); 
Các vấn đề liên quan