python - 为什么 Ubuntu 上的 PhantomJS 会被 Google map 注册为触摸设备?

标签 python selenium google-maps-api-3 phantomjs

Ubuntu 和 Mac 之间的 PhantomJS 不一致,Google map 在 Ubuntu 上识别为触摸设备

我最近偶然发现操作系统之间的 PhantomJS 看起来不一致。

我正在使用 Python 2.7 Selenium 模块 (2.42.1) 和 PhantomJS (1.9.7) 来测试网站应用程序。在使用 Google Maps JS API 3 测试网页时,我注意到 Google map 似乎在 Ubuntu 上将 PhantomJS 识别为触摸设备,但奇怪的是在 Mac 上却不能。

我整理了一个简单的Google Maps JavaScript API v3 Example .

所发生的情况是,缩放控制按钮在 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')

给我this result on mac但是this result on 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

尝试后checking几件事后我得出的结论是问题出在平台 token 上。将 Unknown 更改为 X11(如下例所示)后,Google map 停止将 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 脚本给出 this result .

最佳答案

您是否尝试过手动设置 PhantomJS 的用户代理?有趣的是(在 Mac 上使用 Safari),当我将用户代理设置为 iPhone 时,您的测试页面会加载移动 UI,因此这可能是一个不正确的浏览器嗅探的简单情况。

以下是如何使用 page.settings 设置用户代理的示例:https://github.com/ariya/phantomjs/blob/master/examples/useragent.js

此示例还将记录默认用户代理是什么 - 以及 mailing list evidence似乎暗示用户代理在不同操作系统之间肯定有所不同。

关于python - 为什么 Ubuntu 上的 PhantomJS 会被 Google map 注册为触摸设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24956212/

相关文章:

java - 无法使用 Selenium 和 Java 在 Mac OSX 中启动 Safari 12 浏览器

python - Scrapy/Selenium - 响应 url 未传递到网络浏览器

javascript - 未捕获的类型错误 : Cannot set property 'position' of undefined

python - 搜索包含PSAW python列表中任何单词的reddit评论

python - 在python中将距离矩阵重新排列成 block 形式

python - 将 RandomForestClassifier Predict_Proba 结果添加到原始 Dataframe

selenium - 用好的 Selenium 教程指导我

javascript - 如何强制谷歌自动完成结果为 "native language"?

javascript - 使用 JavaScript 显示 Google map 标记

Python 数据库 sqlite3