为什么Ubuntu上的PhantomJS被Google Maps识别为触控设备?

1 投票
2 回答
599 浏览
提问于 2025-04-18 14:45

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')

在Mac上给我这个结果,而在Ubuntu上则给我这个结果

有没有办法让我阻止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 个回答

0

这是我在使用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();
});
1

你有没有试过手动设置PhantomJS的用户代理?根据我的经验(我在Mac上用Safari测试),当我把用户代理设置成iPhone时,你的测试页面会加载移动版界面,所以这可能只是浏览器识别错误的问题。

这里有个例子,教你怎么用page.settings来设置用户代理:https://github.com/ariya/phantomjs/blob/master/examples/useragent.js

这个例子还会记录下默认的用户代理是什么——而且邮件列表的讨论似乎也表明,不同的操作系统之间用户代理确实是有差异的。

撰写回答