Files
2021-08-02 12:41:02 +02:00

88 lines
3.4 KiB
C#

using PuppeteerSharp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PuppeteerSharpTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void btnScrape_Click(object sender, EventArgs e)
{
var result = await LoadXXXAsync();
}
private async Task<DtoEst> LoadXXXAsync()
{
// downloads chromium to the local project, needed by Puppeteer Sharp for execution, takes about 2 min!
await new BrowserFetcher().DownloadAsync();
// await new BrowserFetcher().DownloadAsync(DefaultChromiumRevision);
DtoEst dto = new DtoEst();
//var url = "https://www.xxxxxx.xhtml";
var url = "https://www.bmf-steuerrechner.de/ekst/eingabeformekst.xhtml";
#region SELECTORS
// https://stackoverflow.com/questions/45110893/select-elements-by-attributes-with-colon
// use css escapes: https://mothereff.in/css-escapes
string id_checkbox_IsMarried = "bmf_form_ekst:ekst_pv:0";
string id_input_Umsatz = "bmf_form_ekst:ekst_zve";
string id_button_Submit2 = @"#bmf_form_ekst\3A income_ekst";
string NettoUmsatz = txtNettoUmsatz.Text;
#endregion
//// This statement downloads and installs chromium
//await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
using (var page = await browser.NewPageAsync())
{
// load page
await page.GoToAsync(url);
// wait for element to be there
await page.WaitForExpressionAsync($"document.getElementById('{id_input_Umsatz}')!=null");
await page.EvaluateExpressionAsync($"document.getElementById('{id_input_Umsatz}').value = '{NettoUmsatz}';");
// get element value
var val = await page.EvaluateFunctionAsync<string>($"()=>document.getElementById('{id_input_Umsatz}').value");
// wait for element to be there
await page.WaitForExpressionAsync($"document.getElementById('{id_checkbox_IsMarried}')!=null");
await page.EvaluateExpressionAsync($"document.getElementById('{id_checkbox_IsMarried}').checked = false;");
await page.ClickAsync(id_button_Submit2);
// wait for redirect
await page.WaitForNavigationAsync();
// get value from element
var strValueEst = await page.EvaluateFunctionAsync<string>("()=>document.querySelector('#ui-id-4 > div.ekst_ergebnis > div:nth-child(6) > table > tbody > tr:nth-child(3) > td:nth-child(2) > strong').textContent");
// get value from element
var strValueEstPercent = await page.EvaluateFunctionAsync<string>("()=>document.querySelector('#ui-id-4 > div.ekst_ergebnis > div:nth-child(6) > table > tbody > tr:nth-child(3) > td:nth-child(3) > strong').textContent");
var deDE = new CultureInfo("de-DE");
Decimal.TryParse(strValueEst.TrimEnd(" Euro".ToCharArray()), NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint, deDE, out var decValueEst);
Decimal.TryParse(strValueEstPercent.TrimEnd(" %".ToCharArray()), NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint, deDE, out var decValueEstPercent);
dto.EstBetrag = decValueEst;
dto.EstProzentsatz = decValueEstPercent;
}
return await Task.FromResult(dto);
}
}
}