2011-11-17 42 views
6

Tôi muốn cho phép người dùng nhập và đưa ra một số quyết định dựa trên nó. Nếu tôi làm điều này:Làm thế nào tôi có thể nhắc nhập bằng Selenium/Webdriver và sử dụng kết quả?

driver.execute_script("prompt('Enter smth','smth')") 

Tôi nhận được lời nhắc tốt, nhưng tôi không thể sử dụng giá trị của nó. Có cách nào hiển thị hộp nhập liệu cho người dùng không và sử dụng giá trị được nhập ở đó?

EDIT: Đây là kịch bản của tôi:

từ selenium.webdriver nhập khẩu Firefox

if __name__ == "__main__": 
    driver = Firefox() 
    driver.execute_script("window.promptResponse=prompt('Enter smth','smth')") 
    a = driver.execute_script("var win = this.browserbot.getUserWindow(); return win.promptResponse") 
    print "got back %s" % a 

Và điều này thoát với ngoại lệ sau đây:

a = driver.execute_script("var win = this.browserbot.getUserWindow(); return win.promptResponse") 
    File "c:\python26\lib\site-packages\selenium-2.12.1-py2.6.egg\selenium\webdriver\remote\webdriver.py", line 385, in ex 
ecute_script 
    {'script': script, 'args':converted_args})['value'] 
    File "c:\python26\lib\site-packages\selenium-2.12.1-py2.6.egg\selenium\webdriver\remote\webdriver.py", line 153, in ex 
ecute 
    self.error_handler.check_response(response) 
    File "c:\python26\lib\site-packages\selenium-2.12.1-py2.6.egg\selenium\webdriver\remote\errorhandler.py", line 110, in 
check_response 
    if 'message' in value: 
TypeError: argument of type 'NoneType' is not iterable 

gì tôi không làm đúng không?

EDIT: Tôi đã cố gắng để làm như prestomanifesto gợi ý, đây là kết quả:

In [1]: from selenium.webdriver import Firefox 

In [2]: f = Firefox() 

In [3]: a = f.ex 
f.execute    f.execute_async_script f.execute_script 

In [3]: a = f.execute_script("return prompt('Enter smth','smth')") 

In [4]: a 
Out[4]: {u'text': u'Enter smth'} 

In [5]: a 
Out[5]: {u'text': u'Enter smth'} 

In [6]: class(a) 
    File "<ipython-input-6-2d2ff4f61612>", line 1 
    class(a) 
     ^
SyntaxError: invalid syntax 


In [7]: type(a) 
Out[7]: dict 

Trả lời

1

Bạn là chính xác trong việc sử dụng hộp nhắc trong javascript. Nhưng giá trị hộp nhắc sẽ được gán cho biến toàn cầu và sau đó bạn có thể sử dụng biến này sau. một cái gì đó như thế này:

driver.execute_script("window.promptResponse=prompt('Enter smth','smth')")

và sau đó lấy giá trị từ biến toàn cầu tương tự.

a = driver.execute_script("var win = this.browserbot.getUserWindow(); return win.promptResponse") 

có thể bạn cần truyền lại.

Hy vọng điều này sẽ hữu ích.

+0

tôi cập nhật câu hỏi của tôi với kết quả chạy mã của bạn. Bạn có thể nhận ra những gì tôi không làm đúng không? – Geo

0

Tại sao không trả lại giá trị trực tiếp?

if __name__ == "__main__": 
    driver = Firefox() 
    a = driver.execute_script("return prompt('Enter smth','smth')") 
    print "got back %s" % a 

Làm việc cho tôi trong C#. Phải thừa nhận rằng đó là phiên bản Selenium hơi cũ nhưng tôi không mong đợi chức năng execute_script thay đổi nhiều.

+0

Vấn đề là 'execute_script' trả về ngay lập tức. Nó không chặn cho đến khi tôi nhập đầu vào. Xem chỉnh sửa của tôi. – Geo

0

Bạn có thể sử dụng kỹ thuật này gợi ý here

Ý tưởng cơ bản là: lệnh

  • Issue Selenium lên đến điểm mà bạn muốn chụp đầu vào người dùng.
  • Lấy đầu vào sử dụng trong cửa sổ giao diện điều khiển với raw_input()
  • Tiếp tục Selenium bạn lệnh

Trong Python ví dụ:

#Navigate to the site 
driver.Navigate().GoToUrl("http://www.google.com/") 
#Find the search box on the page 
queryBox = self.driver.FindElement(By.Name("q")) 
#Wait for user text input in the console window 
text = raw_input("Enter something") 
#Send the retrieved input to the search box 
queryBox.SendKeys(text) 
#Submit the form 
queryBox.Submit() 
+0

Tôi muốn giữ nó dựa trên GUI. – Geo

0

Nếu các bạn sử dụng selen 2.28 như tôi này sẽ làm các trick giống như @ Baz1nga nói

//Open the prompt inbox and setup global variable to contain the result 
WebDriver driver = new FirefoxDriver(); 
JavascriptExecutor js = (JavascriptExecutor) driver; 
js.executeScript("window.promptResponse = prompt(\"Please enter captcha\");"); 

//Handle javascript prompt box and get value. 
Alert alert = driver.switchTo().alert(); 
try { 
    Thread.sleep(6000); 
} catch (Exception e) 
{ 
    System.out.println("Cannot sleep because of headache"); 
} 
alert.accept(); 
String ret = (String) js.executeScript("return window.promptResponse;"); 
0

Hope this helps khác:

# selenium (3.4.1) python (3.5.1) 
driver.execute_script("var a = prompt('Enter Luffy', 'Luffy');document.body.setAttribute('data-id', a)") 
time.sleep(3) # must 
print(self.driver.find_element_by_tag_name('body').get_attribute('data-id')) # get the text 
Các vấn đề liên quan