2011-11-17 91 views
6

我想允許用戶輸入並根據它做出一些決定。如果我這樣做:如何使用Selenium/Webdriver提示輸入並使用結果?

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

我得到一個不錯的提示,但我不能用它的價值。是否有任何方法向用戶顯示輸入框,並使用在那裏鍵入的值?

編輯:這是我的腳本:

從selenium.webdriver導入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 

而這將退出與以下異常:

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 

什麼我不這樣做對嗎?

編輯:我試圖做這樣prestomanifesto建議,這裏的輸出:

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 

回答

1

您在使用JavaScript中的提示框正確。但提示框值應該被分配給一個全局變量,然後你可以稍後使用這個變量。 是這樣的:

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

,然後檢索來自同一個全局變量的值。

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

您可能需要施放回報。

希望這會有所幫助。

+0

我更新了我與運行代碼的結果問題。你能發現我做得不對嗎? – Geo

0

爲什麼不直接返回值?

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

適用於C#。誠然,這是一個稍微老的硒版本,但我不希望execute_script函數改變很多。

+0

事情是,'execute_script'立即返回。它不會阻止,直到我輸入輸入。看我的編輯。 – Geo

0

你可以使用的技術建議here

的基本思路是:

  • 問題Selenium命令,直到您想要捕捉用戶輸入的點。
  • 獲取與raw_input()
  • 在控制檯窗口中用戶輸入您繼續Selenium命令

在Python例如:如果你們使用硒2

#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

我想保持它基於GUI。 – Geo

0

。28像我這樣就可以了,就像@ Baz1nga說

//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

希望這會幫助別人:

# 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 
相關問題