【发布时间】:2019-10-21 18:54:02
【问题描述】:
我认为,这个问题与 Selenium 的内部运作有关。在另一篇帖子Referer missing in HTTP header of Selenium request 中,很明显运行之间存在差异
driver.execute_script("window.location.href = '{}';".format(url))
和
driver.get("javascript: window.location.href = '{}'".format(url))
后一个命令会随请求一起发送Referer header,前一个不会。
此时如果这是所需的行为或错误,则无关紧要,两个命令都应该发送Referer。另外,window.location.href = ... 只是一个例子。
然而,很明显,使用命令 driver.execute_script("...") 和 driver.get("javascript: ..." 运行 JavaScript 之间肯定存在差异,如果它们不会产生相同的结果。所以问题更多是关于两个命令在内部没有调用相同的 Selenium 代码这一事实。
这两个命令有什么区别?
【问题讨论】:
-
您为什么要以复杂的方式调用
url,如javascript: window.location.href = '{}'".format(url),而您拥有久经考验且强大的get("{}".format(url))?你的具体用例是什么? -
这可能是同一个调用,这意味着 .get 示例调用 (window.location.href = "") 两次。 Execute_script 也会先注入,然后调用。
-
其他差异将涉及 .get 内部的任何验证/实用方法。 (它可能会稍微清理一下网址......不确定当里面有一个javascript调用时它会做什么......但它可能只是用URL替换整个东西,这样它就不会执行两次或得到进入某种循环。)
-
我假设 Selenium 正在使用 window.location.href 进行页面更改。现在我查看了源代码,事实并非如此。 (打头...当然因为启动浏览器时的第一页是空白的并且无法插入JS!) .get (或navigationto)实际上发送了一个get 请求。所以不同之处在于,当您使用 .get 方法时,中间服务器(代理服务器?节点?)发送的是 get 请求,而不是浏览器。所以代理此时没有推荐人,但您的本地电话。
标签: python selenium webdriver geckodriver http-referer