Chrome强制升级引起的H5自动化异常

H5自动化用Chrome模拟手机浏览器很方便,它需要和Chrome浏览器版本相对应的chromedriver。(对应关系参考官方说明

Chrome升级到最新的v63,chromedriver升级到最新的v2.34,按版本对应关系表是匹配的。但是,单击操作却变成了右键单击,bug,未找到解决方案。

遂回退chromedriver到v2.33,相应的,回退Chrome浏览器到v61,单击变右击问题消失了,但有些元素click无反应,明明找到了元素(isDisplayed(),isEnabled()等均为true)并且正常click未抛错,但元素实际“纹丝未动”。尝试等待延迟、多次点击,尝试用Actions的click,(new Actions(driver)).click(driver.findElement(By.xpath("//button[text()='取消']"))).perform();,尝试用JavaScript来click,((JavascriptExecutor)driver).executeScript("arguments[0].click();", driver.findElement(By.xpath("//button[text()='取消']")));,甚至还尝试网上说法先点击父元素再点击目标元素,都无效。

检查浏览器发现,刚刚下载的v61浏览器竟然悄悄升级到了v63……
查:禁止Chrome自动更新,参考了这篇文章,Applications - Google Chrome - Show Package Contents - Contents - Info.plist - 把 KSUpdateURL 改成无效URL。结果Chrome仍然顽强地自动更新了。
再查,参考“Mac Chrome浏览器取消自动升级(看这一篇就够了)”,cd /Library/Google/GoogleSoftwareUpdate - 删除GoogleSoftwareUpdate.bundle,检查Chrome - chrome://settings/help,

Google Chrome may not be able to keep itself updated.

终于乖乖得停止了自动升级。再次执行,元素终于顺利被click中。

另一台Mac找不到这个目录 cd /Library/Google/GoogleSoftwareUpdate,正好作者提供了方案二,

1
2
cd ~/Library/Google
sudo chown root:wheel GoogleSoftwareUpdate

相当于修改了GoogleSoftwareUpdate这个文件夹的拥有者,而不仅仅是修改了权限,使Google对该文件夹没有写入权限。事实证明这种方式是可行的。

顺便提一下,如果Chrome打开后未正常进入手机浏览器模拟模式,需检查Chrome driver的启动设置。
网上有些教程,已经过时了,需要参考官方说明示例,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WebDriver driver;
@BeforeClass
public void beforeClass(){
System.setProperty("webdriver.chrome.driver", " "PATH to chromedriver ...")");

Map<String, String> mobileEmulation = new HashMap<>();
mobileEmulation.put("deviceName", "Nexus 5X");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setExperimentalOption("mobileEmulation", mobileEmulation);

try {
System.out.println("开始启动driver~~~");
driver = new ChromeDriver(chromeOptions);
System.out.println("启动driver成功~~~");
} catch (Exception e) {
System.out.println("启动driver失败~~~");
System.out.println(e.getMessage());
}
}