我使用带有Selenium的Chrome驱动程序2.35的WebDriver。
我有一个双显示器设置,我在其中运行我的测试用例。我大部分时间都无条件地运行我的情况但有时候,当我想调试时,我用浏览器运行它。
窗口打开,我将它拖到我的第二台显示器上,继续使用我的主显示器中的其他东西。但是,只要在二级Chrome Selenium屏幕中有操作,焦点就会转移到该窗口,我将失去控制权。
这真的很烦人,还有其他人遇到过这个问题吗?任何解决方案?
答案 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驱动程序控制台窗口。
答案 2 :(得分:0)
我的重点是被盗的解决方案一直只是使用VM或远程计算机,并在需要时远程连接到进程以进行调试。
答案 3 :(得分:0)
即使我遇到过这个问题,我发现的解决方案是从第二台显示器运行我的解决方案(即)将Eclipse拖到第二台显示器然后运行测试。