如何通过 Selenium 的 --user-data-dir 参数打开 Chrome 配置文件

Posted

技术标签:

【中文标题】如何通过 Selenium 的 --user-data-dir 参数打开 Chrome 配置文件【英文标题】:How to open a Chrome Profile through --user-data-dir argument of Selenium 【发布时间】:2018-11-11 02:29:12 【问题描述】:

我正在尝试使用我现有的帐户和我的个人资料中的设置来加载带有 selenium 的 chrome 浏览器。

我可以使用 ChromeOptions 来设置 userdatadir 和配置文件目录。这会像我想要的那样使用我的个人资料加载浏览器,但是浏览器随后会挂起 60 秒并超时,而无需再推进任何自动化。

如果我不使用用户数据目录和配置文件设置,它可以正常工作,但不使用我的配置文件。

我所做的阅读表明,一次不能使用相同的配置文件打开多个浏览器,因此我确保在运行程序时没有打开任何内容。即使没有打开其他浏览器,它仍然会挂起 60 秒。

m_Options = new ChromeOptions();
m_Options.AddArgument("--user-data-dir=C:/Users/Me/AppData/Local/Google/Chrome/User Data");
m_Options.AddArgument("--profile-directory=Default");
m_Options.AddArgument("--disable-extensions");
m_Driver = new ChromeDriver(@"pathtoexe", m_Options);
m_Driver.Navigate().GoToUrl("somesite");

它总是挂在 GoToUrl 上。我不确定还能尝试什么。

【问题讨论】:

【参考方案1】:

根据您的代码试验,您尝试加载 Default Chrome 配置文件,这将违反所有 最佳实践 作为 默认 Chrome 配置文件可能包含以下内容之一:

扩展 书签 浏览历史记录 等

因此,默认 Chrome 配置文件 可能不符合您的测试规范,并且可能会在加载时引发异常。因此,您应该始终使用 自定义 Chrome 配置文件,如下所示。

创建打开一个新的Chrome配置文件,您需要执行以下步骤:

打开Chrome浏览器,点击侧边菜单并点击设置,其中url@987654328 @ 打开。 在人物部分,点击管理其他人,弹出一个弹出窗口。 点击添加人员,提供人名,选择图标,保留项目为此创建桌面快捷方式用户选中并点击添加按钮。 您的新个人资料已创建。 新个人资料的快照SeLeNiUm

现在桌面图标将创建为 SeLeNiUm - Chrome 从桌面图标 SeLeNiUm - Chrome 的属性中获取配置文件目录的名称。例如--profile-directory="配置文件 2"

获取系统中profile-directory的绝对路径,如下:

C:\\Users\\Thranor\\AppData\\Local\\Google\\Chrome\\User Data\\Profile 2

现在通过 ChromeOptions 的实例传递 profile-directory 的值,使用 AddArgument 方法和键 user-data-dir如下:

m_Options = new ChromeOptions();
m_Options.AddArgument("--user-data-dir=C:/Users/Me/AppData/Local/Google/Chrome/User Data/Profile 2");
m_Options.AddArgument("--disable-extensions");
m_Driver = new ChromeDriver(@"pathtoexe", m_Options);
m_Driver.Navigate().GoToUrl("somesite");

执行你的Test

观察 Chrome 使用 Chrome 配置文件 初始化为 SeLeNiUm

【讨论】:

按照建议将默认值添加到用户数据目录的末尾会导致它在现有默认文件夹中创建一个默认文件夹并且不使用我的配置文件。但是它确实运行了一次。当试图在不更改任何代码的情况下重新运行它时,它会挂起 60 秒,这让我觉得在测试运行后某些东西没有被正确清除,但我不知道是什么。 @Thranor 查看我更新的答案并告诉我状态 这正是我所做的。我不确定为什么它在目录结构中表现得非常糟糕,并创建了一个新的配置文件作为子目录。浏览器使用我的设置启动,它只是无法导航。它只会挂在我的主页上并在 60 秒后超时。到目前为止,我提出的每次都有效的解决方案(目前有 15 个测试)是每次程序运行时将配置文件克隆到项目内的某个位置,然后将 selenium 指向该克隆。我不知道为什么这行得通,但指向实际的配置文件不起作用。 这里有同样的问题。复制了所有建议的步骤,但只有克隆有效。 克隆在 Windows 10 环境中对我不起作用。我必须克隆 and 然后输入 options.add_argument('no-sandbox') 让它工作。值得注意的是,使用 options.add_argument('user-data-dir=selenium') 对我不起作用,我需要使用完整路径。用泡菜作为处理饼干的另一种方法的实验对我来说也失败了。在github.com/theintern/intern/issues/878 了解无沙盒问题【参考方案2】:

如果您想使用默认配置文件运行 Chrome(因为您需要扩展程序),您需要使用其他浏览器(例如 Microsoft Edge 或 Microsoft IE)运行脚本,并且您的代码将启动 Chrome 实例。

我的 php 代码:

namespace Facebook\WebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Chrome\ChromeOptions;

require_once('vendor/autoload.php');

$host = 'http://localhost:4444/';

$options = new ChromeOptions();
$options->addArguments(array(
    '--user-data-dir=C:\Users\paulo\AppData\Local\Google\Chrome\User Data',
    '--profile-directory=Default',
    '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
));
   
$caps = DesiredCapabilities::chrome();
$caps->setCapability(ChromeOptions::CAPABILITY, $options);
$caps->setPlatform("Windows");

$driver = RemoteWebDriver::create($host, $caps);

$driver ->manage()->window()->maximize();

$driver->get('https://www.google.com/');

// your code goes here.

$driver->quit();

【讨论】:

以上是关于如何通过 Selenium 的 --user-data-dir 参数打开 Chrome 配置文件的主要内容,如果未能解决你的问题,请参考以下文章

如何以较低的速度运行 Selenium(通过 Capybara 使用)?

如何通过 Selenium 自动化大型机

selenium:python如何绕过登录页面登录网页

如何使用 Selenium 和 Java 通过 PageFactory 等待元素不可见

如何通过 Selenium Python 点击​​一个元素

如何根据提供的HTML通过Selenium和Python搜索节点?