0

我正在为 microsoft edge 使用 selenium webdriver(4.0.0) 的 beta 版本。我不知道如何将数据保存为打印窗口中的 pdf,该窗口在我单击主窗口中的按钮后打开

           var found = await driver.WaitForElementToAppear(".//font[contains(text(),'Uploaded')]", 180, token);
            if(found)
            {
//All buttons , which when clicked opens Print window
                var ebrcElements = driver.ElementsByXpath(".//input[@type='submit']");
                foreach (var ebrcElement in ebrcElements)
                {
                    ebrcElement.Click();//Opens the new window
                    Thread.Sleep(2000);
                    driver.SwitchToNewWindow();//Switches to the last window
//The window has "Print" and "Cancel" button
                    driver.CloseCurrentWindow();
                    driver.SwitchToFirstWindow();
                }
            }
4

1 回答 1

0

由于单击打印按钮时打开的窗口是一个操作系统对话框,因此无法直接从 selenium 访问它。我解决问题的方法是使用 P/Invoke。使用 Visual Studio 的 spy++ 工具很容易找到窗口句柄及其标题。

接下来我定义了方法

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

并称之为,

       var saveHandle = FindWindowByCaption(IntPtr.Zero, "Save Print Output As");

下一步是使用句柄将窗口置于前台。为此,我使用了该方法

[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

最后一步是模拟键盘和鼠标操作。为此,我使用了库 InputSimulator。可以使用 nuget 包管理器下载

                var ins = new InputSimulator();
                ins.Keyboard.TextEntry($"ebrc{irandom.NextDouble()}");
                Thread.Sleep(2000);
                ins.Keyboard.KeyPress(WindowsInput.Native.VirtualKeyCode.TAB);
                ins.Keyboard.KeyPress(WindowsInput.Native.VirtualKeyCode.TAB);
                ins.Keyboard.KeyPress(WindowsInput.Native.VirtualKeyCode.RETURN);
于 2021-07-10T17:50:45.957 回答