使用 selenium,您可以执行任意 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()
.
如果您需要将响应文本传递给 selenium,则不要alert(this.responseText)
使用return this.responseText
or并将(or )return this.response
的结果分配给变量(如果使用 python)。对于将或相应的java。execute_script
execute_async_script
executeScript()
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);
result
将包含您的 JavaScript 的返回值,前提是 js 代码是同步的。设置false
为第三个参数以xhr.open(..)
强制请求同步。将第三个参数设置为true
或省略它将使请求异步。
❗️ 如果您正在调用异步js 代码,请确保execute_script
您使用而不是使用execute_async_script
,否则该调用将不会返回任何内容!
注意:如果您需要将字符串参数传递给 javascript,请确保始终使用转义它们json.dumps(myString)
,否则当字符串包含单引号或双引号或其他棘手字符时,您的 js 将中断。