为什么Ubuntu上的PhantomJS被Google Maps识别为触控设备?
PhantomJS在Ubuntu和Mac之间的不一致性,Google Maps在Ubuntu上识别为触摸设备
最近我发现了一个在不同操作系统上使用PhantomJS时出现的不一致现象。
我正在使用Python 2.7的Selenium模块(2.42.1)和PhantomJS(1.9.7)来测试网站应用。在使用Google Maps JS API 3测试一个网页时,我注意到Google Maps在Ubuntu上似乎把PhantomJS识别为触摸设备,但在Mac上却没有。
我做了一个简单的Google Maps JavaScript API v3示例。
发生的情况是,触摸设备(比如iOS或Android设备)上的缩放控制按钮看起来不同,它们更大,并且位于左下角。
运行以下的Python脚本
# -*- coding: utf-8 -*-
from selenium import webdriver
import os, time
browser = webdriver.PhantomJS(service_log_path=os.path.devnull)
browser.set_window_size(1280, 800)
browser.get("https://notendur.hi.is/~sfg6/google_maps_example/")
time.sleep(5)
browser.save_screenshot('test_google_maps_api_screenshot.png')
有没有办法让我阻止PhantomJS被识别为触摸设备呢?
回答:
正如Jeff Sisson在下面的回答中提到的,问题出在用户代理字符串上。
PhantomJS在Ubuntu上使用了以下用户代理字符串:
Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.7 Safari/534.34
而在Mac上使用的是:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
经过尝试和检查一些内容后,我得出结论,问题出在平台标识符上。在将Unknown
改为X11
后,如下例所示,Google Maps不再把PhantomJS当作移动设备。
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import os, time
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 "
"(KHTML, like Gecko) PhantomJS/1.9.7 Safari/534.34"
)
browser = webdriver.PhantomJS(desired_capabilities=dcap,service_log_path=os.path.devnull)
browser.set_window_size(1280, 800)
browser.get("https://notendur.hi.is/~sfg6/google_maps_example/")
time.sleep(5)
browser.save_screenshot('test_google_maps_api_screenshot_x11.png')
在Ubuntu上运行上述Python脚本得到了这个结果。
2 个回答
这是我在使用Chrome时的最新情况。
var page = require('webpage').create();
page.settings.userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36';
page.viewportSize = { width: 600, height: 200};
page.open('http://optime.dev.puppetsproutatwork.com/email/weekly/7780', function() {
page.render('github.png', {format: 'png', quality: '100'});
phantom.exit();
});
你有没有试过手动设置PhantomJS的用户代理?根据我的经验(我在Mac上用Safari测试),当我把用户代理设置成iPhone时,你的测试页面会加载移动版界面,所以这可能只是浏览器识别错误的问题。
这里有个例子,教你怎么用page.settings
来设置用户代理:https://github.com/ariya/phantomjs/blob/master/examples/useragent.js
这个例子还会记录下默认的用户代理是什么——而且邮件列表的讨论似乎也表明,不同的操作系统之间用户代理确实是有差异的。