C# Selenium Saving pdf page

Как я могу выполнить сохранение этой страницы непосредственно в формате PDF? Я знаю, что селен не может управлять диалоговым окном Chrome... Есть ли другой способ?

Изображение: страница для сохранения в pdf

4 ответа

Еще один способ сохранить это, указав Chrome сохранить на диск, вместо этого открыв страницу. Ниже приведен способ сделать:

ChromeOptions chromeOptions = new ChromeOptions();
// this will make automatically download to the default folder.
chromeOptions.AddUserProfilePreference("plugins.always_open_pdf_externally", true);  
ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService();
chromeDriver = new ChromeDriver(chromeDriverService, chromeOptions);

var downloadsPath = KnownFolders.Downloads.Path;
var generatedFilePngs = Directory.GetFiles(downloadsPath, string.Format("{0}*.pdf", "TheNameOfYourPDF"));

Этот приведенный ниже код поможет сохранить страницу в формате pdf в Selenium c #.

      using OpenQA.Selenium;

using OpenQA.Selenium.Chrome;

protected void PDFconversion(ChromeDriver driver, string root, string rootTemp)
{
    //Grid.Rows.Add(TxtBxName.Text, TxtBxAddress.Text);
    try
    {
        IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
        Thread.Sleep(500);
        js.ExecuteScript("setTimeout(function() { window.print(); }, 0);");
        Thread.Sleep(500);
        driver.SwitchTo().Window(driver.WindowHandles.Last());
        Thread.Sleep(500);
        string JSPath = "document.querySelector('body>print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('#destinationSettings').shadowRoot.querySelector('#destinationSelect').shadowRoot.querySelector('print-preview-settings-section:nth-child(9)>div>select>option:nth-child(3)')";
        Thread.Sleep(500);
        IWebElement PrintBtn = (IWebElement)js.ExecuteScript($"return {JSPath}");
        Thread.Sleep(500);
        PrintBtn.Click();
        string JSPath1 = "document.querySelector('body>print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('print-preview-button-strip').shadowRoot.querySelector('cr-button.action-button')";
        Thread.Sleep(1000);
        IWebElement PrintBtn1 = (IWebElement)js.ExecuteScript($"return {JSPath1}");
        PrintBtn1.Click();
        Thread.Sleep(1000);
        SendKeys.Send("{HOME}");
        SendKeys.Send(rootTemp + "\\" + "result.pdf"); // Path
        SendKeys.Send("{TAB}");
        SendKeys.Send("{TAB}");
        SendKeys.Send("{TAB}");
 
        SendKeys.Send("{ENTER}");
        Thread.Sleep(1000);
   
    }
    catch (Exception ex)
    {


    }

}

Внутри браузера Chrome все всплывающие диалоговые окна являются html-страницами, поэтому вы можете нажимать на них с помощью Selenium. В вашем случае вы можете перейти на страницу, смоделировать нажатие кнопки Ctrl + P на клавиатуре, переключиться в диалоговое окно печати, нажать кнопку "Изменить", чтобы изменить принтер, нажмите "Сохранить в PDF", нажмите кнопку "Сохранить", и когда появится окно "Сохранить как" - Имитация Нажмите кнопку клавиатуры, чтобы сохранить файл. Я не делаю C#, но вот как это выглядит в Java, на самом деле я проверил это, и это на самом деле работает:

Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_P);
robot.keyRelease(KeyEvent.VK_P);
robot.keyRelease(KeyEvent.VK_CONTROL);

// get current browser window handles and switch to window with handle that is last in the list
Set<String> windowHandles = driver.getWindowHandles();
for (String handle : windowHandles) {
    driver.switchTo().window(handle);
}

driver.findElement(By.xpath("//button[contains(text(), 'Change')]")).click();
driver.findElement(By.xpath("//span[contains(text(), 'Save as PDF')]")).click();
driver.findElement(By.xpath("//button[contains(text(), 'Save')]")).click();

// you might need to add waiter here that waits a second, since script is too fast
// and needs to wait for save dialog box to be shown

robot.keyPress(KeyEvent.VK_ENTER);

Вы можете напрямую отправить запрос на URL без участия Selenium и получить байтовый массив с содержимым файла PDF. После этого вы можете читать содержимое файла, используя некоторую библиотеку PDF (похоже, ITextSharp популярен).

Другие вопросы по тегам