Парсинг изображения на Selenium C# / чистым C# в открытом браузере Selenium

столкнулся с проблемой парсинга изображения в Selenium. Сейчас проблема решается через обрезку скриншота страницы сайта, что является проблемой, т.к. требуется определенное разрешение экрана. Сама программа работает на удаленной машине и требует постоянного клиент-подключения для фиксирования разрешения экрана. Интересует средство сохранения изображения с сайта напрямую, без обрезки или иных, связанных с фиксированным разрешением, махинаций. P.s.Возможно прямое взаимодействие C# кода с открытым WebDriver браузером без использования самого Selenium?

private void buttonOrder_Click(object sender, EventArgs e)
        {
            for (int ContinueProgr = 1; ContinueProgr < 6; ContinueProgr++)
            {
                if (ContinueProgr == 5)
                {
                    Thread.Sleep(600000);
                    ContinueProgr = 1;
                }

                try
                {
                    //UserCredential credential;
                    //using (var stream = new FileStream("credentials.json", FileMode.Open, FileAccess.Read));

                    string slesh1 = @"\";
                    string slesh2 = "\\";
                    string savePlace = FolderSaveOrder.Text.Replace(slesh1, slesh2);
                    OpenQA.Selenium.Chrome.ChromeOptions co = new OpenQA.Selenium.Chrome.ChromeOptions();
                    var downloadDirectory = FolderSaveOrder.Text;
                    co.AddUserProfilePreference("download.default_directory", downloadDirectory);
                    //co.AddUserProfilePreference("download.prompt_for_download", false);
                    //co.AddUserProfilePreference("disable-popup-blocking", "true");

                    Browser = new OpenQA.Selenium.Chrome.ChromeDriver(co);
                    Browser.Manage().Window.Maximize();

                    Thread.Sleep(2000);
                    try
                    {
                        Browser.Navigate().GoToUrl("https://rosreestr.ru/wps/portal/p/cc_present/ir_egrn");
                    }
                    catch (TimeoutException ignore) { }

                    Thread.Sleep(2500);

                    WebDriverWait ww = new WebDriverWait(Browser, TimeSpan.FromSeconds(500));
                    IWebElement kinput62 = ww.Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("input[style = 'width: 62px;']")));
                    IWebElement kinput321 = Browser.FindElement(By.XPath("/html/body/div[1]/div[6]/div[4]/div/div/section/div[2]/div[2]/div/div/div[2]/div/div[2]/div/div/div/div[1]/div/div/div/div[1]/div/div/div/div/div[2]/div/div/div/div[2]/div/div/div[3]/div/input"));
                    IWebElement kinput322 = Browser.FindElement(By.XPath("/html/body/div[1]/div[6]/div[4]/div/div/section/div[2]/div[2]/div/div/div[2]/div/div[2]/div/div/div/div[1]/div/div/div/div[1]/div/div/div/div/div[2]/div/div/div/div[2]/div/div/div[5]/div/input"));
                    IWebElement kinput323 = Browser.FindElement(By.XPath("/html/body/div[1]/div[6]/div[4]/div/div/section/div[2]/div[2]/div/div/div[2]/div/div[2]/div/div/div/div[1]/div/div/div/div[1]/div/div/div/div/div[2]/div/div/div/div[2]/div/div/div[7]/div/input"));
                    IWebElement kinput92 = ww.Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("input[style = 'width: 92px;']")));

                    Clipboard.Clear();
                    Clipboard.SetText(KeyOrder.Text.ToString());
                    kinput62.SendKeys(OpenQA.Selenium.Keys.Control + "v");
                    Thread.Sleep(120);
                    Clipboard.Clear();

                    Browser.FindElement(By.ClassName("v-button-caption")).Click();
                    ww.Until(ExpectedConditions.ElementIsVisible(By.XPath("/html/body/div[1]/div[6]/div[4]/div/div/section/div[2]/div[2]/div/div/div[2]/div/div[1]/div/div/div/div[1]/div/div/div/div[1]/div/div/div/div/div[1]/div/div/span/span"))).Click();

                    IWebElement NumKadastr = ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("input[class='v-textfield v-textfield-prompt'][style='width: 704px;']")));

                    List<string> kadastr = new List<string>() { };

                    for (int i = 0; i < KadNumberBox.Lines.Length; i++)
                    {
                        if (KadNumberBox.Lines[i].Length != 0)
                            kadastr.Add(KadNumberBox.Lines[i].Trim());
                    }

                    Directory.CreateDirectory(savePlace + "\\Выписки");

                    //Чтение кадастров с файла
                    List<string> KadExcracts = new List<string>();
                    FileStream TextKadExcracts = new FileStream(savePlace + "\\Выписки" + "\\Выписки.txt", FileMode.OpenOrCreate);
                    StreamReader readFile = new StreamReader(TextKadExcracts);
                    while (!readFile.EndOfStream)
                    {
                        KadExcracts.Add(readFile.ReadLine());
                    }
                    readFile.Close();


                    if (KadExcracts.Count > 0)
                    {
                        //Удаление номера выписки и '='
                        for (int KD=0; KD < KadExcracts.Count; KD++)
                        {
                            int pos = KadExcracts[KD].LastIndexOf('=');
                            KadExcracts[KD] = KadExcracts[KD].Substring(0, pos);
                        }

                        for (int KD = 0; KD < KadExcracts.Count; KD++)
                        {
                            kadastr.Remove(KadExcracts[KD]);
                        }
                    }

                    //ID Rucapcha
                    RuCaptchaClient client = new RuCaptchaClient("1217247ab60e169d371f2ebad8eb8c87");

                    Directory.CreateDirectory(savePlace + "\\Капчи");

                    for (int i = 0; i < kadastr.Count; i++)
                    {
                        IWebElement NumKadastrRepit = ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("input[style='width: 704px;']")));
                        NumKadastrRepit.Clear();
                        NumKadastrRepit.SendKeys(kadastr[i]);
                        IWebElement pregoin = ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("input[class='v-filterselect-input'][style='width: 302px;']")));

                        if (pregoin.Text != regionBox.Text)
                        {
                            pregoin.Clear();
                            Clipboard.Clear();
                            Clipboard.SetText(regionBox.Text.ToString());

                            pregoin.SendKeys(OpenQA.Selenium.Keys.Control + "v");
                            Thread.Sleep(1400);
                            pregoin.SendKeys(OpenQA.Selenium.Keys.Enter);
                            Thread.Sleep(1400);
                        }

                        ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("img[src*=i_icon]"))).Click();
                        Thread.Sleep(350);
                        ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("input[style='width: 704px;']"))).SendKeys(OpenQA.Selenium.Keys.Enter);
                        Thread.Sleep(350);
                        //"Найти":
                        //ww.Until(ExpectedConditions.ElementIsVisible(By.XPath("/html/body/div[1]/div[6]/div[4]/div/div/section/div[2]/div[2]/div/div/div[2]/div/div[2]/div/div/div/div[1]/div/div/div/div[3]/div/div/div/div[1]/div/div/div/div[1]/div/div/span/span"))).Click();
                        //Выбор элемента поиска:
                        //ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("td[class='v-table-cell-content v-table-cell-content-cadastral_num']"))).Click();
                        //ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div[class='v-label'][style='width: 195px;']"))).Click();
                        ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("td[class='v-table-cell-content v-table-cell-content-black'][style='width: 91px;']"))).Click();



                        string savePlaceimg = savePlace + "\\Капчи" + "\\capcha" + i.ToString() + ".png";
                        // ww.Until((By.CssSelector("img[src*=captcha]"))).Click();

                        IJavaScriptExecutor js = Browser as IJavaScriptExecutor;
                        System.Threading.Thread.Sleep(3000);
                        Boolean RedTextString = Browser.FindElements(By.CssSelector("div[class='v-label v-label-red red']")).Count() > 0;

                        if (RedTextString == true)
                        {
                            IWebElement RedText = ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div[class='v-label v-label-red red']")));
                            if (RedText.Text == "Запрос сведений по аннулированным объектам невозможен.")
                            {
                                using (FileStream fstream = new FileStream(savePlace + "\\Выписки" + "\\Выписки.txt", FileMode.Append))
                                {

                                    string TextForTxt = kadastr[i] + "=" + "Аннулирован" + "\n";

                                    // преобразуем строку в байты
                                    byte[] array = System.Text.Encoding.Default.GetBytes(TextForTxt);
                                    // запись массива байтов в файл
                                    fstream.Write(array, 0, array.Length);
                                }
                                ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div[style='overflow: hidden; padding-left: 0px; padding-top: 0px; position: absolute; left: 0px; top: 0px; width: 334px; height: 32px;'] span[class='v-button-caption']"))).Click();
                                continue;
                            }
                        }


                        js.ExecuteScript("window.scrollBy(0,1000);");
                        System.Threading.Thread.Sleep(4000);
                        //ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("img[src*=captcha]"))).Click();
                        IWebElement my_image = ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("img[src*=captcha]")));
                        int width = my_image.Size.Width;
                        int height = my_image.Size.Height;
                        Point point = new Point(my_image.Location.X, my_image.Location.Y - 734);
                        //TakeScreenshot().Save(savePlace + "\\capCrop" + i.ToString() + ".png");
                        TakeScreenshot(Browser, savePlaceimg);
                        //System.Threading.Thread.Sleep(2000);
                        CropPixel(savePlaceimg, point, width, height).Save(savePlace + "\\Капчи" + "\\capCrop" + i.ToString() + ".png");

                        IWebElement InputCapcha = ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("input[class='v-textfield v-textfield-srv-field srv-field']")));

                        ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("img[src*=captcha]")));
                        string captcha_id = client.UploadCaptchaFile(savePlace + "\\Капчи" + "\\capCrop" + i.ToString() + ".png");
                        string answer = null;
                        while (string.IsNullOrEmpty(answer))
                        {
                            Thread.Sleep(15000);
                            //try
                            //{
                                answer = client.GetCaptcha(captcha_id);
                                Clipboard.Clear();
                                Clipboard.SetText(answer);
                                InputCapcha.SendKeys(OpenQA.Selenium.Keys.Control + "v");
                                Thread.Sleep(400);
                                InputCapcha.SendKeys(OpenQA.Selenium.Keys.Enter);
                                Thread.Sleep(1400);

                        }



                        System.Threading.Thread.Sleep(2000);

                        if (InputCapcha.Text != answer)
                        {
                            Clipboard.Clear();
                            Clipboard.SetText(answer);
                            InputCapcha.Clear();
                            InputCapcha.SendKeys(OpenQA.Selenium.Keys.Control + "v");
                            Thread.Sleep(400);
                            InputCapcha.SendKeys(OpenQA.Selenium.Keys.Enter);
                            Thread.Sleep(2400);
                        }

                        Thread.Sleep(2400);

                        //Отправить запрос
                        //IWebElement PopWindowsstart =  
                        ww.Until(ExpectedConditions.ElementIsVisible(By.XPath("/html/body/div[1]/div[6]/div[4]/div/div/section/div[2]/div[2]/div/div/div[2]/div/div[2]/div/div/div/div[1]/div/div/div/div[1]/div/div/div/div[4]/div/div/div/div[1]/div/div/div/div[1]/div/div/span/span"))).Click();

                        Thread.Sleep(2000);

                        Boolean isPresent = Browser.FindElements(By.CssSelector("div[class='v-label v-label-tipFont tipFont v-label-undef-w'] b")).Count() > 0;
                        if (isPresent == false)
                        {
                            if (InputCapcha.Text != answer)
                            {
                                Clipboard.Clear();
                                Clipboard.SetText(answer);
                                InputCapcha.Clear();
                                InputCapcha.SendKeys(OpenQA.Selenium.Keys.Control + "v");
                                Thread.Sleep(400);
                                InputCapcha.SendKeys(OpenQA.Selenium.Keys.Enter);
                                Thread.Sleep(2400);
                            }



                        IWebElement NumExctract = ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div[class='v-label v-label-tipFont tipFont v-label-undef-w'] b")));

                     using (FileStream fstream = new FileStream(savePlace + "\\Выписки" + "\\Выписки.txt", FileMode.Append))
                        {

                            string TextForTxt = kadastr[i] + "=" + NumExctract.Text + "\n";

                            // преобразуем строку в байты
                            byte[] array = System.Text.Encoding.Default.GetBytes(TextForTxt);
                            // запись массива байтов в файл
                            fstream.Write(array, 0, array.Length);
                        }

                        ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div[class='v-window-closebox'][id*='window_close']"))).Click();

                        Thread.Sleep(1000);

                        ////Продолжить работу

                        ww.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div[style='overflow: hidden; padding-left: 0px; padding-top: 0px; position: absolute; left: 0px; top: 0px; width: 334px; height: 32px;'] span[class='v-button-caption']"))).Click();


                        if (i != kadastr.Count - 1)
                        {
                            Thread.Sleep(300000);
                        }


                    }

                    ww.Until(ExpectedConditions.ElementIsVisible(By.XPath("div[class='v-label vlabel-tipFont tipFont v-label-undef-w'] b")));
                    Thread.Sleep(350);

                    Browser.Close();
                    Browser.Quit();
                    Directory.Delete(savePlace + "\\Капчи", true);

                    MessageBox.Show("Выписки заказаны! \nОжидайте обработки на Росреестре.");
                    break;

                }
                catch
                {
                    string slesh1 = @"\";
                    string slesh2 = "\\";
                    string savePlace = FolderSaveOrder.Text.Replace(slesh1, slesh2);
                    Browser.Close();
                    Browser.Quit();
                    try
                    {
                        Directory.Delete(savePlace + "\\Капчи", true);
                    }
                    catch
                    {
                        continue;
                    }
                    Thread.Sleep(300000);
                }
            }
            //}
        }

Ответы (1 шт):

Автор решения: Andrew

Если все же хочеться сделать это через селениум, то ты должен найти на странице нужный <img>, у него скопировать значение атрибута "src" и выкачать изображение повторно через шарп при помощи WebClient. Если понадобиться, то подставить в веб клиент куки скопированные из selenium.

Это самый простой способ.

→ Ссылка