Selenium Chrome窗口在第二个监视器屏幕上运行,窃取焦点

时间:2018-02-28 08:17:03

标签: google-chrome selenium

我使用带有Selenium的Chrome驱动程序2.35的WebDriver。

我有一个双显示器设置,我在其中运行我的测试用例。我大部分时间都无条件地运行我的情况但有时候,当我想调试时,我用浏览器运行它。

窗口打开,我将它拖到我的第二台显示器上,继续使用我的主显示器中的其他东西。但是,只要在二级Chrome Selenium屏幕中有操作,焦点就会转移到该窗口,我将失去控制权。

这真的很烦人,还有其他人遇到过这个问题吗?任何解决方案?

4 个答案:

答案 0 :(得分:1)

Selenium chromedriver在启动时只会一次。之后你可以在后台运行浏览器而不会出现任何问题(我们这样做,使用chromedriver 2.30,所以我确定它有效)

因此,您的Web测试中可能会有一些执行焦点窃取的代码:

1)更改活动窗口或打开新窗口/新选项卡会导致焦点窃取。

2)你明确地在一个元素上调用Focus()。

你确定你的代码没有这样的电话吗?

答案 1 :(得分:0)

我建议将窗口位置设置为始终在底部。在C#中,您可以通过类似于以下的类来完成此操作:

 
public static class SetWindowPosition
{
    [DllImport("user32.dll")]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
    static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
    private const UInt32 SWP_NOSIZE = 0x0001;
    private const UInt32 SWP_NOMOVE = 0x0002;
    private const UInt32 SWP_NOACTIVATE = 0x0010;

    [DllImport("user32.dll")]
    private static extern bool LockSetForegroundWindow(uint uLockCode);
    private const UInt32 LSFW_LOCK = 1;

    public static void ForceWindowToStayOnBottom(Process process)
    {
        SetWindowPos(
            process.MainWindowHandle, // The handle of the browser window
            HWND_BOTTOM, // Tells it the position, in this case the bottom
            0, 0, 0, 0, // Coordinates for sizing of the window - Will be overriden by NOSIZE
            SWP_NOSIZE | // Says to keep the window its current size
            SWP_NOMOVE | // Says to keep the window in its current spot
            SWP_NOACTIVATE // Activation brings the window to the top, we don't want that
        );

        // If you don't notice this helping, it can probably be deleted.
        // It only deals with other applications and gets automatically undone on user interaction
        LockSetForegroundWindow(
            LSFW_LOCK); // Locks calls to SetForegroundWindow 
    }

    /// <returns> Returns the parent process of each process by the name of processName </returns>
    public static List<Process> GetPrimaryProcesses(string processName) =>

        Process.GetProcesses() // Gets a list of every process on computer
            .Where(process => process.ProcessName.Contains(processName) // Reduces the list to every process by the name we are looking for
                && process.MainWindowHandle != IntPtr.Zero) // Removes any process without a MainWindow (which amounts to every child process)
            .ToList();
}

称为:

SetWindowPosition.ForceWindowToStayOnBottom(
    SetWindowPosition.GetPrimaryProcesses("chrome")[0]);

其中[0]是您要最小化的窗口的索引(通常它们会按照打开的顺序返回)。

这与您将窗口设置为AlwaysOnTop时的操作类似(尝试打开任务管理器,单击选项,然后选择Always On Top作为示例),反之亦然。您应该可以在任何您喜欢的进程上调用它,包括Web驱动程序控制台窗口。

如果您想进一步了解其工作原理,这两篇文章(12)是我过去常用的文章,以及MSDN文档here。< / p>

答案 2 :(得分:0)

我的重点是被盗的解决方案一直只是使用VM或远程计算机,并在需要时远程连接到进程以进行调试。

答案 3 :(得分:0)

即使我遇到过这个问题,我发现的解决方案是从第二台显示器运行我的解决方案(即)将Eclipse拖到第二台显示器然后运行测试。