今晚我已经全网,大约3-4个小时了。我已经尝试了我遇到的每一个建议。我甚至检查过"功能"我的Selenium驱动程序对象上的对象,以确保它实际设置在那里,实际上它是:
#<Selenium::WebDriver::Remote::Capabilities:0x00000007475cf0
@capabilities=
{:browser_name=>"phantomjs",
:version=>"1.9.7",
:platform=>:"linux-unknown-64bit",
:javascript_enabled=>true,
:css_selectors_enabled=>true,
:takes_screenshot=>true,
:native_events=>true,
:rotatable=>false,
:firefox_profile=>nil,
:proxy=>#<Selenium::WebDriver::Proxy:0x00000007475908 @type=:direct>,
"driverName"=>"ghostdriver",
"driverVersion"=>"1.1.0",
"handlesAlerts"=>false,
"databaseEnabled"=>false,
"locationContextEnabled"=>false,
"applicationCacheEnabled"=>false,
"browserConnectionEnabled"=>false,
"webStorageEnabled"=>false,
"acceptSslCerts"=>false,
"proxy"=>{"proxyType"=>"direct"},
"phantomjs.page.settings.userAgent"=>
"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:27.0) Gecko/20100101 Firefox/27.0"}>
除了&#34; phantomjs.page.settings.userAgent&#34;,我已经尝试过&#34; userAgent&#34;等等。我在过去3-4小时内在网上找到的所有内容,我试过了。显然,在2013年初,这是一个相当普遍的问题,而我所说的解决方案显然是常见的解决方案。这些都不起作用,事实上,我从这一点信息中确切地知道这一点(请注意,User-Agent是&#34; Ruby&#34;):
UNCAUGHT EXCEPTION: {"errorMessage"=>"Element is not currently visible and may not be manipulated",
"request"=>
{"headers"=>
{"Accept"=>"application/json",
"Accept-Encoding"=>"gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
"Connection"=>"close",
"Content-Length"=>"2",
"Content-Type"=>"application/x-www-form-urlencoded",
"Host"=>"localhost:9876",
"User-Agent"=>"Ruby"},
"httpVersion"=>"1.1",
"method"=>"POST",
"post"=>"{}",
"postRaw"=>"{}",
"url"=>"/click",
"urlParsed"=>
{"anchor"=>"",
"query"=>"",
"file"=>"click",
"directory"=>"/",
"path"=>"/click",
"relative"=>"/click",
"port"=>"",
"host"=>"",
"password"=>"",
"user"=>"",
"userInfo"=>"",
"authority"=>"",
"protocol"=>"",
"source"=>"/click",
"queryKey"=>{},
"chunks"=>["click"]},
"urlOriginal"=>
"/session/a03cc440-4f5c-11e4-8854-ed9c22bf60af/element/%3Awdc%3A1412822036214/click"}}
不幸的是,关于这些Selenium问题以及许多其他问题,还有很多信息和讨论,如果你正在使用Java。在这一点上,我希望我在这个项目中使用Java的各种方式,但现在我有30,000行代码,我在过去2个月内完全自己编写。失去这项工作,至少现在,不仅对我个人来说是毁灭性的,而且对我的工作来说也是灾难性的。
是什么给出的?我是否真的需要深入挖掘并自定义源代码以获得我想要的内容,或者此功能真的现在实现了吗?我再次看到了2013年初的所有答案,但它们对我不起作用,我不知道为什么,或者如何轻松解决它。我已经到了最后期限,所以这开始变得非常紧张。
有没有人对我有任何想法?请记住,我使用的是Ruby,而不是Java。
Selenium-webdriver是2.43。 PhantomJS是1.9.7。 GhostDriver是1.1.0。
对我来说,这似乎不可思议,无法修改您的用户代理。
如果我能提供任何其他可能有帮助的信息,请告诉我。
如果您能够分享一些想法或一些信息以便让我指出正确的方向,我会提前感谢。
答案 0 :(得分:6)
在Java中,我做了以下内容:(PhantomJS 1.9.8,Selenium 2.39)
String userAgent = "Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; LG-LU3000 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1";
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability(PhantomJSDriverService.PHANTOMJS_PAGE_SETTINGS_PREFIX + "userAgent", userAgent);
PhantomJSDriver driver = new PhantomJSDriver(caps);
也许Ruby有类似的设置选项。看看“page.settings.userAgent”
答案 1 :(得分:1)
capabilities = Selenium::WebDriver::Remote::Capabilities.phantomjs('phantomjs.page.settings.userAgent' => 'some user Agent')
@instance = Selenium::WebDriver.for(:remote,:url=>'http://localhost:8910',:desired_capabilities=>capabilities)
答案 2 :(得分:0)
最终没有&#34;可能&#34;开箱即用,正如月亮蝇在他对我的问题的评论中提到的那样。然而,事实证明这相对容易。我应该注意,这并没有解决我的特殊问题。我假设,或许是天真的,因为User-Agent&#39; Ruby&#39;我得到了奇怪的结果。结果我花了好几个小时搞清楚这一点;我仍然得到相同的结果。
但是,对于那些有帮助的人,你必须为Selenium做一个快速的猴子补丁。讨厌,粗暴,丑陋,黑客,我知道。但是,它成功了。
请注意,这是Ruby的selenium-webdriver版本2.43.0的猴子补丁 - 如果您有其他版本,则无法保证这将有效。
module Selenium
module WebDriver
module Remote
module Http
class Default < Common
private
def request(verb, url, headers, payload, redirects = 0)
# THIS IS WHERE OUR CUSTOM CHANGE BEGINS
headers.merge!('User-Agent' => 'Whatever User Agent You May Want')
# THIS IS WHERE OUR CUSTOM CHANGE ENDS
request = new_request_for(verb, url, headers, payload)
retries = 0
begin
response = response_for(request)
rescue Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EADDRINUSE
# a retry is sometimes needed on Windows XP where we may quickly
# run out of ephemeral ports
#
# A more robust solution is bumping the MaxUserPort setting
# as described here:
#
# http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.20%29.aspx
raise if retries >= MAX_RETRIES
request = new_request_for(verb, url, headers, payload)
retries += 1
retry
rescue Errno::ECONNREFUSED => ex
if use_proxy?
raise ex.class, "using proxy: #{proxy.http}"
else
raise
end
end
if response.kind_of? Net::HTTPRedirection
raise Error::WebDriverError, "too many redirects" if redirects >= MAX_REDIRECTS
request(:get, URI.parse(response['Location']), DEFAULT_HEADERS.dup, nil, redirects + 1)
else
create_response response.code, response.body, response.content_type
end
end
end
end
end
end
end