15

POSTメソッドで作成されたフォーム送信を処理するアプリケーションAがあります。リクエストを開始する実際のフォームは、完全に別のアプリケーションBにあります。私はSeleniumを使用してアプリケーションAをテストしており、フォーム送信処理のテストケースを作成するのが好きです。

これを行う方法?これはSeleniumで実行できますか?アプリケーションAには、この要求を開始できるフォームがありません。

リクエストはPOSTを使用する必要があることに注意してください。そうでない場合は、WebDriver.get(url)メソッドを使用できます。

4

3 に答える 3

13

セレンを使用すると、プログラムでフォームを送信するなど、任意のJavascriptを実行できます。

Selenium Javaを使用した最も単純なJS実行:

if (driver instanceof JavascriptExecutor) {
    System.out.println(((JavascriptExecutor) driver).executeScript("prompt('enter text...');"));
}

また、Javascriptを使用すると、POSTリクエストを作成し、必要なパラメーターとHTTPヘッダーを設定して、送信できます。

// Javascript example of a POST request
var xhr = new XMLHttpRequest();
// false as 3rd argument will forces synchronous processing
xhr.open('POST', 'http://httpbin.org/post', false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send('login=test&password=test');
alert(xhr.response);

最新の最先端のブラウザでは、を使用することもできますfetch()

セレンに応答テキストを渡す必要がある場合は、またはをalert(this.responseText)使用する代わりに、 (または)の結果を変数に割り当てます(Pythonを使用している場合)。これに対応するJavaの場合。return this.responseTextreturn this.responseexecute_scriptexecute_async_scriptexecuteScript()executeAsyncScript()

Pythonの完全な例を次に示します。

from selenium import webdriver

driver = webdriver.Chrome()

js = '''var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://httpbin.org/post', false);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

xhr.send('login=test&password=test');
return xhr.response;'''

result = driver.execute_script(js);

resultjsコードが同期している場合、JavaScriptの戻り値が含まれます。リクエストを強制的に同期させるためfalseの3番目の引数として設定します。xhr.open(..)3番目の引数をに設定するtrueか、それを省略すると、要求は非同期になります。

❗️非同期jsコードを呼び出す場合は、execute_script使用する代わりにexecute_async_script、そうでない場合は呼び出しが何も返さないことを確認してください。

注:文字列引数をjavascriptに渡す必要がある場合は、必ずを使用してエスケープしてください。そうしjson.dumps(myString)ないと、文字列に一重引用符または二重引用符、またはその他のトリッキーな文字が含まれている場合にjsが壊れます。

于 2017-01-22T19:33:37.880 に答える
3

Seleniumを使用してそれが可能だとは思いません。Webブラウザを使用して何もないところからPOSTリクエストを作成する方法はありません。SeleniumはWebブラウザを操作することで機能します。代わりにHTTPライブラリを使用してPOSTリクエストを送信し、Seleniumテストと一緒に実行することをお勧めします。(どの言語/テストフレームワークを使用していますか?)

于 2012-05-08T08:09:00.820 に答える
1

私が見つけた最も簡単な方法は、POSTリクエストを送信するためだけに中間ページを作成することです。セレンにページを開いてもらい、フォームを送信してから、最終ページのソースを取得します。

from selenium import webdriver
html='<html><head><title>test</title></head><body><form action="yoursite.com/postlocation" method="post" id="formid"><input type="hidden" name="firstName" id="firstName" value="Bob"><input type="hidden" name="lastName" id="lastName" value="Boberson"><input type="submit" id="inputbox"></form></body></html>'
htmlfile='/tmp/temp.html'
    try:
        with open(htmlfile, "w") as text_file:
            text_file.write(html)
    except:
        print('Unable to create temporary HTML file')
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Firefox()
driver.get('file://'+htmlfile)
driver.find_element_by_id('inputbox').click();
#wait for form to submit and finish loading page
wait = WebDriverWait(driver, 30)
response=driver.page_source
于 2020-05-31T01:39:46.493 に答える