小编sap*_*ket的帖子

有适用于Brave浏览器的Selenium驱动程序吗?

我已经有使用Google Chrome的功能齐全的抓取工具。为了使其快速运行,我以编程方式配置了广告拦截器,跟踪器拦截器,图像拦截器,弹出式拦截器等(基本上是每种拦截器)。有许多行配置代码需要维护。

随之而来的是勇敢。

内置了我想要的所有阻止器-内置!它也基于Chromium构建-就像Chrome一样。因此,我可以将ChromeDriver与Brave结合使用。但这真的有用吗?

所以我尝试了-但失败了-以下异常:

System.InvalidOperationException occurred
  HResult=0x80131509
  Message=unknown error: no chrome binary at C:\SOMEPATH\Brave64\app-0.22.22\brave.exe
  (Driver info: chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform=Windows NT 6.1.7601 SP1 x86_64)
  Source=WebDriver
  StackTrace:
   at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
   at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Remote.RemoteWebDriver.StartSession(ICapabilities desiredCapabilities)
   at OpenQA.Selenium.Remote.RemoteWebDriver..ctor(ICommandExecutor commandExecutor, ICapabilities desiredCapabilities)
   at OpenQA.Selenium.Chrome.ChromeDriver..ctor(ChromeOptions options)
   at FOO.GOO.Historical.Scrape.Session.CreateDriver[T]() in D:\FOO\FOO.GOO.Historical.Scrape\Session.cs:line 211
   at FOO.GOO.Historical.Scrape.TestFixtures.Pages.PageTest.SessionSetUp(Boolean login) in D:\FOO\FOO.GOO.Historical.Scrape\TestFixtures\Pages\PageTest.cs:line 23
   at FOO.GOO.Historical.Scrape.TestFixtures.ScraperTests.SetUp() in D:\FOO\FOO.GOO.Historical.Scrape\TestFixtures\ScraperTests.cs:line 21
Run Code Online (Sandbox Code Playgroud)

因此很明显,它不能直接替换。ChromeDriver表示它需要Chrome二进制文件,而不是勇敢的二进制文件。

有人可以解释一下是否有适合Brave的驱动程序?我已经为性能提升而垂涎三尺。

selenium brave

5
推荐指数
1
解决办法
1350
查看次数

使用 Selenium ChromeDriver 如何加载保存的扩展设置?

我正在使用Selenium.WebDriver.ChomeDriverv2.38.0 和Chromev66.0.3359.117(官方版本)。

为了继续讨论,我将提供示例扩展。对于这篇文章,我将使用Ghostery - Privacy Ad Blockerv8.1.2。

我使用 C# 加载扩展 crx 文件,如下所示:(跳过创建 crx 的步骤)

var options = new ChromeOptions();
options.AddExtension(workFolder + @"\Chrome32\extensions\8.1.2_0.crx");
var driver = new ChromeDriver(options);
Run Code Online (Sandbox Code Playgroud)

效果很好:Ghostery 加载到它的默认设置。不幸的是,所有阻止程序都被禁用。

切换回我的桌面并手动打开 Chrome - 我看到它确实加载了我保存的设置(所有被 Ghostery 阻止的设置)。这告诉我,我需要以某种方式以编程方式加载保存的设置。我相当确定在我手动浏览 Chrome 期间能够做到这一点,因为它加载了我的 Chrome 用户配置文件C:\Users\USERNAME\AppData\Local\Google\Chrome\User Data\Default

我已经知道我可以使用直接加载此用户配置文件

options.AddArgument("user-data-dir=" + @"C:\Users\USERNAME\AppData\Local\Google\Chrome\User Data\Default");
Run Code Online (Sandbox Code Playgroud)

但我不想使用该配置文件。它有 70MB 大,并且有很多我不想使用的与之相关的好东西。

相反,我想以编程方式加载保存的扩展设置,或者以某种方式将它们保存在一个可以为我加载的地方。窥探一圈,发现Extension State用户配置文件中有一个文件夹:

在此处输入图片说明

我的预感是必须有一种方法可以以 Selenium 方式加载这些扩展设置?

c# selenium google-chrome-extension selenium-chromedriver

5
推荐指数
1
解决办法
2211
查看次数

如何复制粘贴 WPF 窗口(克隆)而不出现错误

我正在使用 .Net 4.5.2 与 WPF 和 C# 5.0。我在 WPF 项目中创建了一个窗口。我想复制粘贴此窗口到解决方案资源管理器中,创建第二个窗口,并将其重命名为新名称。

当我这样做时,新的(复制的)窗口的 InitializeComponent() 方法总是给我一个错误。如何在解决方案资源管理器中干净地复制窗口(及其代码等)?

这个问题在这里得到了部分回答:复制粘贴 WPF 窗口给出错误,但答案没有解决我的问题。

我的方法(不起作用):

  1. 创建一个窗口并将其命名为 WindowTest
  2. 在解决方案资源管理器中,选择 WindowTest 并复制,然后将其粘贴到同一项目中
  3. 将新复制的窗口重命名为 WindowTestCopy
  4. 在WindowTestCopy中,将xaml中的x:class属性更改为WindowTestCopy而不是WindowTest
  5. 打开WindowTestCopy后面的代码,并将所有对WindowTest的引用更改为WindowTestCopy
  6. 编译

预期:没有错误,复制(克隆)操作成功

实际:编译错误“无法在静态上下文中访问非静态方法‘InitializeComponent’”。

我只有这一个错误。显然,InitializeComponent() 正在成为一个不明确的引用,但我不清楚如何手动编辑代码来解决这个问题。我希望 VS 或 Resharper 能够自动帮助我完成此任务。

更新

WindowTest 包含两个我之前没有提到的用户控件。复制/粘贴发生后,由于某种原因,WindowTestCopy 中的以下 xaml 元素格式错误:

xmlns:userControls....(省略) xmlns:userControls....(省略)

通过删除这些,Resharper 确定 userControl 对象缺少 xmlns 引用标记,并询问我是否要自动导入它们。我选择是。在 Resharper 添加缺少的 xmlns 参考标签后,我能够编译(所有错误都消失了)。

我无法解释为什么会发生这种情况。在我的重现步骤中,我不编辑 xaml,因此它应该与原始 xaml 相同。这是奇怪的行为,但至少有一个如上所述的解决方法。

c# wpf visual-studio

4
推荐指数
1
解决办法
7064
查看次数

如何从属性网格中删除描述区域?

Winforms有一个名为的控件PropertyGrid.该显示元素PropertyGrid是描述区域.默认情况下,它显示所选属性的名称.使用属性,程序员可以让它显示其他文本.我想完全删除它.它占用了太多的空间,我不需要显示任何东西.我没有在对象模型中看到任何属性来删除它.请发布解决方案以将其删除.

下面是我正在谈论的屏幕截图.我想删除红色区域,使"PercentComplete"位于框架的底部.

在此输入图像描述

c# propertygrid winforms

4
推荐指数
1
解决办法
1696
查看次数

C#visual studio如何重新定位nuget包文件夹?

我雇了一个承包商为我做一些编码.他使用以下存储库路径在解决方案文件夹中设置nuget.config:

<configuration>
  <solution>
    <add key="disableSourceControlIntegration"
      value="true" />
  </solution>
  <config>
    <add key="repositoryPath"
      value="../lib" />
  </config>
</configuration>
Run Code Online (Sandbox Code Playgroud)

我对他的决定不太满意:这会将nuget包文件夹放在解决方案文件夹之外.我可以轻松更改存储库路径,只需设置:

value="../<mySolutionFolder>/lib" />
Run Code Online (Sandbox Code Playgroud)

然而,当我这样做时,会发生一件奇怪的事情:我在解决方案中使用的每一个引用现在都被破坏了.我在.csproj文件或其他*.config文件中更改的任何内容都不允许我的项目查找其引用.

唯一的解决方法是从头开始重新创建我的解决方案中的每个项目,并添加 - >现有项目等,并参考 - >管理nuget包,并再次安装每个参考.

我的解决方案中有很多项目,并且每个项目执行此项目都非常耗时.

我想知道是否有一个简单的方法?

似乎应该有一种方法让Nuget和VS很好地玩,这样我就可以轻松地将存储库文件夹移动到不同的路径位置.

c# visual-studio nuget

4
推荐指数
2
解决办法
1万
查看次数

如何在 C# 中将“&lt;”(输入重定向)与 ProcessStartInfo 一起使用?

我有以下几点:

C:\temp\dowork.exe < input.txt
processing.......
complete
C:\
Run Code Online (Sandbox Code Playgroud)

我试试这个:

processArguments = " < input.txt";
pathToExe = "C:\\temp\dowork.exe";
startInfo = new ProcessStartInfo
                {
                     FileName = pathToExe,
                     UseShellExecute = false,
                     WorkingDirectory = FilepathHelper.GetFolderFromFullPath(pathToExe),
                     Arguments = processArguments
                };

try
 {
    using (_proc = Process.Start(startInfo))
     _proc.WaitForExit();
 }
catch (Exception e)
  {
    Console.WriteLine(e);
}
Run Code Online (Sandbox Code Playgroud)

并且在调用 Start() 后我的 dowork.exe 崩溃了。

有什么建议?

发布问题更新。

感谢大家的投入。我使用 amit_g 的回答解决了这个问题。非常感谢 Phil 展示了可能最好的方法(虽然我没有测试它,但我明白为什么它更好)。以下是我的完整解决方案。随意复制和修改您自己的问题。

1)创建一个控制台应用项目,添加这个类

internal class DoWork
{
    private static void Main(string[] args)
    {
        var fs = new FileStream("C:\\temp\\output.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.None);

        var …
Run Code Online (Sandbox Code Playgroud)

c# processstartinfo command-line-arguments

3
推荐指数
2
解决办法
4636
查看次数

如何更改任务管理器中显示的控制台应用程序的名称?

我是以编程方式启动控制台应用程序.它们都显示conhost.exe在任务管理器中.

如何设置进程名称,使其在任务管理器中显示为?

我如何设置进程的示例:

public static Process CreateMultiCoreExeProcess(int coreIndex, int coresToUse, string executableFilepath)
{
    //* Create your Process
    Process process = new Process
    {
        StartInfo =
        {
            FileName = executableFilepath,
            Arguments = coreIndex + " " + coresToUse,
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardOutput = true,
            RedirectStandardError = true
        },
        EnableRaisingEvents = true
    };

    return process;
}
Run Code Online (Sandbox Code Playgroud)

...正如您所看到的,没有一个属性可以设置进程名称(我知道).我希望能够在创建过程时设置进程的名称.

重复问题备注:这不是尝试的重复.作为副本呈现的解决方案是针对流程的STATIC名称,在项目属性中设置.我正在运行我的进程DYNAMICALLY(在运行时),并希望在那时设置进程名称.

更新:我确信这是不可能的.至少不是以现实(即永久)的方式.我相当肯定我们"被卡在"程序集信息中提供的名称,并且无法在任务管理器中以编程方式更改它.这对我的应用程序来说是不幸的,因为它会产生10多个相同的进程可执行文件.有时我只想杀死其中一个,但我无法确定任务管理器中的哪个是因为它们都具有相同的名称.

c# console

3
推荐指数
2
解决办法
2453
查看次数

Selenium ChromeDriver C#如何在页面加载之前进行导航?

我正在测试客户网站的数据流。与我要使用Selenium命令测试的每个页面的数据元素相比,它的广告加载时间要长得多。

我无法控制广告,也无法使其静音。

我想在完整页面加载之前通过单击浏览每个页面。我知道这是可能的,因为我可以使用鼠标手动进行操作。但是,尽管我进行了尝试,但顽固的chromeDriver在加载整个页面之前不会开始自动化。

我正在使用C#.Net 4.6.1,chrome32_55.0.2883.75和Selenium版本3.0.1.0。

此外,我正在使用推荐的Selenium页面对象模型。我实现了WaitForLoad()这样的:

    public override void WaitForLoad()
    {
        _isLoaded = Wait.Until(d =>
        {
            lock (d)
            {
                SwitchToSelf();

                return PageRegex.IsMatch(Session.Driver.PageSource);                    
            }
        });
    } 
Run Code Online (Sandbox Code Playgroud)

上面的PageRegex将起作用,但是仅在加载整个页面之后才起作用。这令人沮丧,因为我可以从视觉上看到PageRegex设计用来解析的文本字符串在屏幕上。这使我相信,也许在我配置ChromeDriver时,还有其他设置可以使我在完全加载Session.Driver.PageSource之前对其进行解析。

这就是我实例化ChromeDriver的方式:

            var options = new ChromeOptions();

            options.AddArguments("test-type");


            options.AddArgument("incognito"); // works
            options.AddArgument("--disable-bundled-ppapi-flash"); // works! this turns off shockwave
            options.AddArgument("--disable-extensions"); // works
            options.AddArguments("--start-fullscreen");

            string workFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) +
                                                 "\\SHARED";

            options.BinaryLocation = workFolder + @"\Chrome32\chrome32_55.0.2883.75\chrome.exe";
            var driver = new ChromeDriver(options);
            driver.Manage().Cookies.DeleteAllCookies();
            return driver;
Run Code Online (Sandbox Code Playgroud)

c# selenium google-chrome

3
推荐指数
1
解决办法
1441
查看次数

将SetWindowPos与多个监视器一起使用

使用user32.dllC#,我编写了下面看到的方法。使用窗口的处理手柄,它将在指定{x,y}位置设置窗口位置。

但是,在多监视器环境中,下面的代码仅将窗口位置设置为主监视器。我也希望能够选择哪个显示器。
有人可以解释一下如何使用SetWindowPos或结合其他user32.dll功能来实现吗?

[DllImport("user32.dll", SetLastError = true)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);

private const int SWP_NOSIZE = 0x0001;
private const int SWP_NOZORDER = 0x0004;
private const int SWP_SHOWWINDOW = 0x0040;

public static void SetWindowPosition(Process p, int x, int y)
{
    IntPtr handle = p.MainWindowHandle;
    if (handle != IntPtr.Zero)
    {
        SetWindowPos(handle, IntPtr.Zero, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_SHOWWINDOW); …
Run Code Online (Sandbox Code Playgroud)

c# windows user32

2
推荐指数
1
解决办法
1099
查看次数

如何自定义 Visual Studio 解决方案资源管理器右键菜单选项?

从我记事起,我就一直在使用 Visual Studio。多年来,每个新版本都出现了越来越多的选项添加到解决方案资源管理器中的右键单击上下文菜单的趋势。在 99% 的情况下,我只使用了这些上下文菜单选项中的 5%。我想知道是否可以从上下文菜单中删除项目?

例如:

打开Visual Studio->创建解决方案->向其添加项目->在解决方案资源管理器中找到该项目->右键单击该项目->观察大量的右键菜单选项。

我目前在 C# 构建环境中使用 Visual Studio 2019 CE。

visual-studio

2
推荐指数
1
解决办法
1252
查看次数