|
@@ -1,4 +1,5 @@
|
|
|
using PuppeteerSharp;
|
|
|
+using static System.Net.Mime.MediaTypeNames;
|
|
|
|
|
|
namespace StationProbe
|
|
|
{
|
|
@@ -34,7 +35,7 @@ namespace StationProbe
|
|
|
private static string _debugFolder = string.Empty;
|
|
|
protected readonly Database _db;
|
|
|
|
|
|
- protected ScreenshotOptions _snapshotOpts = new ScreenshotOptions() {Type = ScreenshotType.Jpeg };
|
|
|
+ protected ScreenshotOptions _snapshotOpts = new ScreenshotOptions() {Type = ScreenshotType.Png };
|
|
|
public static bool DebugMode { get; set; }
|
|
|
|
|
|
|
|
@@ -88,7 +89,6 @@ namespace StationProbe
|
|
|
if (page != null)
|
|
|
{
|
|
|
await page.GoToAsync(_loginUrl);
|
|
|
- await page.WaitForNetworkIdleAsync();
|
|
|
|
|
|
if(DebugMode)
|
|
|
{
|
|
@@ -98,8 +98,8 @@ namespace StationProbe
|
|
|
}
|
|
|
|
|
|
//username
|
|
|
- await page.WaitForSelectorAsync("input[_bl_13]");
|
|
|
- await page.FocusAsync("input[_bl_13]");
|
|
|
+ var userElement = await page.WaitForSelectorAsync("input[id=\"userName\"]");
|
|
|
+ await userElement.FocusAsync();
|
|
|
await page.Keyboard.TypeAsync("justin.xing");
|
|
|
|
|
|
if (DebugMode)
|
|
@@ -110,9 +110,9 @@ namespace StationProbe
|
|
|
}
|
|
|
|
|
|
//password
|
|
|
- await page.WaitForSelectorAsync("input[_bl_14]");
|
|
|
- await page.FocusAsync("input[_bl_14]");
|
|
|
- await page.Keyboard.TypeAsync("123456");
|
|
|
+ var passwordElement = await page.WaitForSelectorAsync("input[id=\"password\"]");
|
|
|
+ await passwordElement.FocusAsync();
|
|
|
+ await page.Keyboard.TypeAsync("vinno@123");
|
|
|
|
|
|
if (DebugMode)
|
|
|
{
|
|
@@ -122,9 +122,8 @@ namespace StationProbe
|
|
|
}
|
|
|
|
|
|
//login
|
|
|
- var button = await page.WaitForSelectorAsync("button[_bl_15]");
|
|
|
- await button.ClickAsync();
|
|
|
- await page.WaitForNavigationAsync();
|
|
|
+ var loginButtonElement = await page.WaitForSelectorAsync("button[b-kvd270uhz9]");
|
|
|
+ await loginButtonElement.ClickAsync();
|
|
|
await page.WaitForNetworkIdleAsync();
|
|
|
|
|
|
if (DebugMode)
|
|
@@ -150,9 +149,12 @@ namespace StationProbe
|
|
|
var page = inputs[ElementType.Page].As<IPage>();
|
|
|
if (page != null)
|
|
|
{
|
|
|
- var frame = await page.WaitForFrameAsync("");
|
|
|
- inputs.AddObject(ElementType.Frame, frame);
|
|
|
+ //var frame = await page.WaitForFrameAsync("");
|
|
|
+ //inputs.AddObject(ElementType.Frame, frame);
|
|
|
|
|
|
+ var menuElement = await page.QuerySelectorAsync("a[href=\"feedback/list\"]");
|
|
|
+ await menuElement.ClickAsync();
|
|
|
+ await page.WaitForNetworkIdleAsync();
|
|
|
if (DebugMode)
|
|
|
{
|
|
|
var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
@@ -182,9 +184,13 @@ namespace StationProbe
|
|
|
public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
|
|
|
{
|
|
|
var page = inputs[ElementType.Page].As<IPage>();
|
|
|
- var frame = inputs[ElementType.Frame].As<IFrame>();
|
|
|
- if(page!= null && frame != null)
|
|
|
+ //var frame = inputs[ElementType.Frame].As<IFrame>();
|
|
|
+ if(page!= null) //&& frame != null)
|
|
|
{
|
|
|
+ var filterElements = await page.QuerySelectorAllAsync("div[class=\"me-3 my-1\"]");
|
|
|
+ var filterElement1 = filterElements[3];
|
|
|
+ var filterElement2 = filterElements[4];
|
|
|
+
|
|
|
//show filter dialog
|
|
|
if (DebugMode)
|
|
|
{
|
|
@@ -194,6 +200,13 @@ namespace StationProbe
|
|
|
}
|
|
|
|
|
|
//input start
|
|
|
+ var openElement1 = await filterElement1.WaitForSelectorAsync("div[class=\"multi-select\"]");
|
|
|
+ await openElement1.ClickAsync();
|
|
|
+ var optionListElement1 = await filterElement1.WaitForSelectorAsync("div[class=\"dropdown-menu shadow\"]");
|
|
|
+ var optionElements = await optionListElement1.QuerySelectorAllAsync("div[class=\"dropdown-item\"]");
|
|
|
+ var targetElement = optionElements[0];
|
|
|
+ await targetElement.ClickAsync();
|
|
|
+
|
|
|
if (DebugMode)
|
|
|
{
|
|
|
var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
@@ -201,6 +214,13 @@ namespace StationProbe
|
|
|
SaveDebugSnapshot(fileName, imageData);
|
|
|
}
|
|
|
|
|
|
+ var openlement2 = await filterElement2.WaitForSelectorAsync("div[class=\"multi-select\"]");
|
|
|
+ await openlement2.ClickAsync();
|
|
|
+ var optionListElement2 = await filterElement2.WaitForSelectorAsync("div[class=\"dropdown-menu shadow\"]");
|
|
|
+ optionElements = await optionListElement2.QuerySelectorAllAsync("div[class=\"dropdown-item\"]");
|
|
|
+ targetElement = optionElements[0];
|
|
|
+ await targetElement.ClickAsync();
|
|
|
+
|
|
|
//input end
|
|
|
if (DebugMode)
|
|
|
{
|
|
@@ -209,9 +229,14 @@ namespace StationProbe
|
|
|
SaveDebugSnapshot(fileName, imageData);
|
|
|
}
|
|
|
|
|
|
- await frame.WaitForSelectorAsync("input[_bl_13]");
|
|
|
- await frame.FocusAsync("input[_bl_13]");
|
|
|
- await page.Keyboard.TypeAsync("justin.xing");
|
|
|
+ //await frame.WaitForSelectorAsync("input[_bl_13]");
|
|
|
+ //await frame.FocusAsync("input[_bl_13]");
|
|
|
+ //await page.Keyboard.TypeAsync("justin.xing");
|
|
|
+
|
|
|
+ var searchTableElement = await page.QuerySelectorAsync("div[class=\"table-search\"]");
|
|
|
+ var searchButtonElement = await searchTableElement.QuerySelectorAsync("button[class=\"btn btn-primary btn-xs ms-2\"]");
|
|
|
+ await searchButtonElement.ClickAsync();
|
|
|
+ await page.WaitForNetworkIdleAsync();
|
|
|
|
|
|
if (DebugMode)
|
|
|
{
|
|
@@ -219,6 +244,19 @@ namespace StationProbe
|
|
|
var fileName = "900000000.jpg";
|
|
|
SaveDebugSnapshot(fileName, imageData);
|
|
|
}
|
|
|
+
|
|
|
+ var pageinationElement = await page.QuerySelectorAsync("div[class=\"table-pagination\"]");
|
|
|
+ var examCountElement = await pageinationElement.QuerySelectorAsync("div[class=\"d-none d-sm-inline-block\"]");
|
|
|
+ var examCountStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", examCountElement);
|
|
|
+ var words = examCountStr.Split(' ');
|
|
|
+ ExamCount = int.Parse(words[1]);
|
|
|
+
|
|
|
+ var pagesElement = await page.QuerySelectorAsync("ul[class=\"pagination\"]");
|
|
|
+ var pageItemElements = await pagesElement.QuerySelectorAllAsync("li");
|
|
|
+ var lastPageElement = pageItemElements[pageItemElements.Length - 2];
|
|
|
+ var textElement = await lastPageElement.QuerySelectorAsync("a");
|
|
|
+ var lastPageStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", textElement);
|
|
|
+ PageCount = int.Parse(lastPageStr);
|
|
|
}
|
|
|
return inputs;
|
|
|
}
|
|
@@ -232,12 +270,37 @@ namespace StationProbe
|
|
|
_page = page;
|
|
|
}
|
|
|
|
|
|
+ private async Task JumpToPageAsync(IPage page)
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ var pagesElement = await page.QuerySelectorAsync("ul[class=\"pagination\"]");
|
|
|
+ var pageItemElements = await pagesElement.QuerySelectorAllAsync("li");
|
|
|
+ var currentPageElemment = await pagesElement.QuerySelectorAsync("li[class=\"page-item active\"]");
|
|
|
+ var textElement = await currentPageElemment.QuerySelectorAsync("a");
|
|
|
+ var currentPageStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", textElement);
|
|
|
+ var currentPage = int.Parse(currentPageStr);
|
|
|
+ if(currentPage != _page+1)
|
|
|
+ {
|
|
|
+ var nextPageElement = pageItemElements[pageItemElements.Length - 1];
|
|
|
+ await nextPageElement.ClickAsync();
|
|
|
+ await page.WaitForNetworkIdleAsync();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
|
|
|
{
|
|
|
var page = inputs[ElementType.Page].As<IPage>();
|
|
|
- var frame = inputs[ElementType.Frame].As<IFrame>();
|
|
|
- if (page != null && frame != null)
|
|
|
+ //var frame = inputs[ElementType.Frame].As<IFrame>();
|
|
|
+ if (page != null) //&& frame != null)
|
|
|
{
|
|
|
+ await JumpToPageAsync(page);
|
|
|
if (DebugMode)
|
|
|
{
|
|
|
var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
@@ -264,12 +327,47 @@ namespace StationProbe
|
|
|
_examIndexInPage = examIndexInPage;
|
|
|
}
|
|
|
|
|
|
+ private async Task JumpToPageAsync(IPage page)
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ var pagesElement = await page.QuerySelectorAsync("ul[class=\"pagination\"]");
|
|
|
+ var pageItemElements = await pagesElement.QuerySelectorAllAsync("li");
|
|
|
+ var currentPageElemment = await pagesElement.QuerySelectorAsync("li[class=\"page-item active\"]");
|
|
|
+ var textElement = await currentPageElemment.QuerySelectorAsync("a");
|
|
|
+ var currentPageStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", textElement);
|
|
|
+ var currentPage = int.Parse(currentPageStr);
|
|
|
+ if (currentPage != _pageIndex + 1)
|
|
|
+ {
|
|
|
+ var nextPageElement = pageItemElements[pageItemElements.Length - 1];
|
|
|
+ await nextPageElement.ClickAsync();
|
|
|
+ await page.WaitForNetworkIdleAsync();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
|
|
|
{
|
|
|
var page = inputs[ElementType.Page].As<IPage>();
|
|
|
- var frame = inputs[ElementType.Frame].As<IFrame>();
|
|
|
- if (page != null && frame != null)
|
|
|
- { //Enter exam
|
|
|
+ //var frame = inputs[ElementType.Frame].As<IFrame>();
|
|
|
+ if (page != null) //&& frame != null)
|
|
|
+ {
|
|
|
+ await JumpToPageAsync(page);
|
|
|
+ var tableElement = await page.QuerySelectorAsync("table[class=\"table table-bordered table-striped table-hover\"]");
|
|
|
+ var examLinkElements = await tableElement.QuerySelectorAllAsync("div[style=\"cursor:pointer;\"]");
|
|
|
+ var eaxmLinkElement = examLinkElements[_examIndexInPage];
|
|
|
+ var patientName = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", eaxmLinkElement);
|
|
|
+ //var examDateStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", examLinkElements[6]);
|
|
|
+ var examDate = DateTime.Now; //Parse(examDateStr);
|
|
|
+ //Enter exam
|
|
|
+ await eaxmLinkElement.ClickAsync();
|
|
|
+ //await page.WaitForNavigationAsync();
|
|
|
+ await page.WaitForNetworkIdleAsync();
|
|
|
|
|
|
if (DebugMode)
|
|
|
{
|
|
@@ -281,30 +379,70 @@ namespace StationProbe
|
|
|
var exmaId = Guid.NewGuid().ToString("N");
|
|
|
|
|
|
//Get patient info
|
|
|
- var patientName = "";
|
|
|
+ //var patientName = "";
|
|
|
var patientSex = "";
|
|
|
var patientAge = 0;
|
|
|
- var examDate = DateTime.Now;
|
|
|
+ //var examDate = DateTime.Now;
|
|
|
|
|
|
- //Get report
|
|
|
var report = "";
|
|
|
+ var reportElements = await page.QuerySelectorAllAsync("div[class=\"col\"]");
|
|
|
+ foreach ( var reportElement in reportElements)
|
|
|
+ {
|
|
|
+ var strong = await reportElement.QuerySelectorAsync("strong");
|
|
|
+ if(strong != null)
|
|
|
+ {
|
|
|
+ var content = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", strong);
|
|
|
+ report += " " + content;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //Get report
|
|
|
+ //var report = "";
|
|
|
|
|
|
//Save images.
|
|
|
var imageUrls = new List<string>();
|
|
|
- for (var i = 0; i < imageUrls.Count; i++)
|
|
|
+ var imageDivElements = await page.QuerySelectorAllAsync("div[class=\"bb-img is-preview\"]");
|
|
|
+ if(imageDivElements != null)
|
|
|
{
|
|
|
- var response = await page.WaitForResponseAsync(imageUrls[i]);
|
|
|
- var buffer = await response.BufferAsync();
|
|
|
- var image = new Image()
|
|
|
+ for(var i=0;i<imageDivElements.Length;i++)
|
|
|
+ {
|
|
|
+ var imageElement = await imageDivElements[i].WaitForSelectorAsync("img");
|
|
|
+ var imageUrl = await imageElement.GetPropertyAsync("src");
|
|
|
+ var url = await imageUrl.JsonValueAsync<string>();
|
|
|
+ imageUrls.Add(url);
|
|
|
+ }
|
|
|
+ await page.ReloadAsync();
|
|
|
+ Parallel.For(0, imageUrls.Count - 1, async(i) =>
|
|
|
{
|
|
|
- Id = Guid.NewGuid().ToString("N"),
|
|
|
- ExamId = exmaId,
|
|
|
- ImageIndex = i,
|
|
|
- Data = buffer,
|
|
|
- CreateTime = DateTime.Now,
|
|
|
- };
|
|
|
- _db.AddImage(image);
|
|
|
+ var url = imageUrls[i];
|
|
|
+ var response = await page.WaitForResponseAsync(response => (response.Request.Url == url && response.Ok));
|
|
|
+ var buffer = await response.BufferAsync();
|
|
|
+ var image = new Image()
|
|
|
+ {
|
|
|
+ Id = Guid.NewGuid().ToString("N"),
|
|
|
+ ExamId = exmaId,
|
|
|
+ ImageIndex = i,
|
|
|
+ Data = buffer,
|
|
|
+ CreateTime = DateTime.Now,
|
|
|
+ };
|
|
|
+ _db.AddImage(image);
|
|
|
+ });
|
|
|
}
|
|
|
+ //var imageUrls = new List<string>();
|
|
|
+ //for (var i = 0; i < imageUrls.Count; i++)
|
|
|
+ //{
|
|
|
+ // var response = await page.WaitForResponseAsync(imageUrls[i]);
|
|
|
+ // var buffer = await response.BufferAsync();
|
|
|
+ // var image = new Image()
|
|
|
+ // {
|
|
|
+ // Id = Guid.NewGuid().ToString("N"),
|
|
|
+ // ExamId = exmaId,
|
|
|
+ // ImageIndex = i,
|
|
|
+ // Data = buffer,
|
|
|
+ // CreateTime = DateTime.Now,
|
|
|
+ // };
|
|
|
+ // _db.AddImage(image);
|
|
|
+ //}
|
|
|
|
|
|
//Save exam.
|
|
|
var exam = new Exam()
|