如何使用Selenium登录Chrome?

时间:2017-05-01 03:00:01

标签: google-chrome selenium google-chrome-extension selenium-chromedriver google-account

我正在测试Chrome扩展程序,该扩展程序要求用户登录才能使用,但我无法弄清楚如何使用我的测试帐户登录。我已尝试登录accounts.google.com,但这显然不够;就chrome API而言,没有经过身份验证的用户。

Chrome会继续提示您在chrome://chrome-signin登录,但由于我无法查看该网页的html,因此我无法确定要在Selenium中与哪些元素进行交互以使用它。

3 个答案:

答案 0 :(得分:4)

您可能需要手动登录一次,然后将其用于自动化。  尝试以下代码,可能会对您有所帮助:

System.setProperty("webdriver.chrome.driver","<chrome exe path>");
ChromeOptions options = new ChromeOptions();
options.addArguments("user-data-dir= <full local path Google Chrome user data default folder>);

WebDriver driver = new ChromeDriver(options);
driver.get("https://mail.google.com");

浏览器启动时手动登录一次。

然后重新运行脚本,它应该使用以前的登录。

希望它会对你有所帮助。

答案 1 :(得分:2)

我认为你仍然可以自动登录。原因是,当打开页面chrome:// chrome-signin时,帐户文本框会自动聚焦,因此您只需要使用键盘登录,而无需知道页面的html如何。

尝试以下代码(您可能需要在某些地方进行一些睡眠以确保所有内容都正确加载。

public void loginToChrome(username, password) {
    driver.get("chrome://chrome-signin");
    var action = new Actions(driver);
    action.sendKeys(username).perform();
    action.sendKeys(keys.ENTER).perform();
    action.sendKeys(password).perform();
    action.sendKeys(keys.ENTER).perform();
}

答案 2 :(得分:0)

首次在常规Chrome浏览器上登录gmail(不是由selenium驱动程序触发的)。登录后,安装EditTheCookie扩展。在gmail选项卡上,单击此扩展图标。它将提供将json格式的cookie复制到剪贴板的选项。将其粘贴到Gmail.data中,将在以下程序中使用。

一旦你过去,将Gmail.data文件放在一个可用的位置以便下面的程序(你可以放在任何地方并相应地在下面的代码中更新该文件的路径)。

我已经开发了这个,并且对我来说是一个有效的解决方案。

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Date;

import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import com.google.gson.Gson;

public class LoginUtils {

private static final String GMAIL_LOGIN_URL = 
"https://accounts.google.com/signin/v2/identifier";

public static void main(String[] args) {
    WebDriver driver = new ChromeDriver();
    driver = LoginUtils.login(driver, GMAIL_LOGIN_URL, "Gmail.data");
}

public static final WebDriver login(WebDriver driver, String url, String pathOfJsonFileName) {
    Cookies[] data = readJson(pathOfJsonFileName);

    driver.navigate().to(url);

    // Set the expire time of each cookie.
    Date expiryTime = new Date(System.currentTimeMillis() + 1000000000);
    for (Cookies cookie : data) {
        Cookie ck = new Cookie(cookie.getName(), cookie.getValue(), cookie.getDomain(), cookie.getPath(),
                expiryTime, Boolean.parseBoolean(cookie.getSecure()), Boolean.parseBoolean(cookie.getHttpOnly()));
        driver.manage().addCookie(ck);
    }
    return driver;
}

private static final Cookies[] readJson(String jsonFileName) {
    String json = null;
    try {
        byte[] encoded = Files.readAllBytes(Paths.get(jsonFileName));
        json = new String(encoded);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return new Gson().fromJson(json, Cookies[].class);
}
}