Парсинг изображения на 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 шт):
Если все же хочеться сделать это через селениум, то ты должен найти на странице нужный <img>, у него скопировать значение атрибута "src" и выкачать изображение повторно через шарп при помощи WebClient. Если понадобиться, то подставить в веб клиент куки скопированные из selenium.
Это самый простой способ.