0

我正在使用 C# 在 Selenium WebDriver 中编写脚本。在脚本中,我正在从网页下载一些文档,我想以动态路径下载它。我正在使用 ChromeOptions 类及其方法来完成任务。这是我的示例代码:

ChromeOptions options = new ChromeOptions();
options.AddUserProfilePreference("download.default_directory", "C:\Users\Desktop\MyDownloads");
IWebDriver driver = new ChromeDriver(@"C:\Users\chromedriver_win32\" , options);

如果我在函数的开头使用上面的代码,那么它工作正常。

但是,我想在函数中间设置 ChromeOptions 类的属性,因为我的路径是动态的。因此,我只是用字符串变量更改硬编码路径,并将以下代码放在函数中间

ChromeOptions options = new ChromeOptions();
options.AddUserProfilePreference("download.default_directory", strDownloadFinalPath);
IWebDriver driver = new ChromeDriver(@"C:\Users\chromedriver_win32\" , options);

现在,当我在函数中间或运行时更新 ChromeOptions 时,它会创建另一个 ChromeDriver 实例并打开另一个 chrome 窗口。它不会更新 ChromeOptions 类的属性。我做了一些实验,比如从 IChromeDriver 类中删除 chromedriver.exe 的路径,但它开始出现以下错误:

当前目录或 PATH 环境变量上的目录中不存在 chromedriver.exe 文件。

在不创建 IWebDriver 类的另一个实例的情况下,在代码中间设置 ChromeOptions 的方法是什么?

4

1 回答 1

1

您只能通过类构造函数设置 ChromeOptions,从而设置下载路径。实例化 ChromeDriver 后,您无法更新任何属性。所以你最后一个问题(“不创建另一个实例”)的答案是,你不能。

我为解决这个问题所做的是检查 Chrome 中的“下载前询问每个文件的保存位置”设置,然后在我的测试中与“另存为”对话框提示进行交互,输入完整的动态保存文件路径并单击“保存”。问题是这是一个 Windows 对话框,Selenium 无法与之交互。我正在使用 MS CodedUI 来处理它。我的另存为提示对话框类:

using Microsoft.VisualStudio.TestTools.UITesting.WinControls;

public class WindowsDialogBoxView : WinWindow
{
    public WindowsDialogBoxView()
    {
        this.SearchProperties[WinWindow.PropertyNames.ClassName] = "#32770";
    }

    public WinEdit FilenameEdit
    {
        get
        {
            this.filenameEdit = new WinEdit(this);
            this.filenameEdit.SearchProperties[WinEdit.PropertyNames.Name] = "File name:";
            return this.filenameEdit;
        }
    }
    private WinEdit filenameEdit;

用法:

WindowsDialogBoxView WindowsDialogBox = new WindowsDialogBoxView();
Keyboard.SendKeys(WindowsDialogBox.FilenameEdit, "C:\\myFileSavePath\\Blah\\FileToSave.abc");

我在与对话框的 Save 按钮交互时遇到了困难,所以我使用Keyboard.SendKeys("{ENTER}");You may have to add some {TAB}s in there。

于 2016-11-01T15:28:53.520 回答