擅长:python、mysql、java
<p>当您调用<code>execute_async_script</code>时,Selenium会将您必须调用的回调作为最后一个参数传递给JavaScript代码,以指示异步代码已完成执行,如果您在调用<code>execute_async_script</code>时没有在脚本后传递参数,则这将作为JavaScript中的<code>arguments[0]</code>来访问。无论传递给这个回调的值是什么,您的<code>execute_async_script</code>都将返回这样的值:</p>
<pre><code>response = driver.execute_async_script("""
var done = arguments[0];
$(document).one("application:subapp:rendered",
function(){
done("foo");
});
""")
</code></pre>
<p>在上面的代码中,我将回调分配给<code>done</code>。我就是喜欢这样做的。注意如何通过调用<code>done("foo")</code>来设置<code>response</code>要设置的值。</p>
<p>还要注意,我使用的是<code>.one()</code>,而不是<code>.on()</code>。我发现Selenium(至少2.45)从不认为为<code>execute_async_script</code>创建的旧回调是“过时的”,因此如果在上面的JavaScript完成执行后,您的事件有可能再次发生<em></em>,那么它将再次调用回调,Selenium将再次执行该调用。如果此时恰好有另一个<code>execute_async_script</code>正在运行,则此虚假调用将终止返回值为“foo”的另一个</em><code>execute_async_script</code>调用。在我的一个测试套件里发生过这种事。它导致了非常奇怪的失败。</p>