|
@@ -1,5 +1,4 @@
|
|
|
using PuppeteerSharp;
|
|
|
-using static System.Net.Mime.MediaTypeNames;
|
|
|
|
|
|
namespace StationProbe
|
|
|
{
|
|
@@ -12,7 +11,7 @@ namespace StationProbe
|
|
|
|
|
|
internal static class ElementConverter
|
|
|
{
|
|
|
- public static T? As<T>(this object obj) where T: class
|
|
|
+ public static T? As<T>(this object obj) where T : class
|
|
|
{
|
|
|
return obj as T;
|
|
|
}
|
|
@@ -30,18 +29,26 @@ namespace StationProbe
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- internal abstract class ProbeTask
|
|
|
+ internal interface IExamStore:IDisposable
|
|
|
{
|
|
|
- private static string _debugFolder = string.Empty;
|
|
|
- protected readonly Database _db;
|
|
|
+ Exam? GetLastExam(int batchTaskId);
|
|
|
+ void AddExam(Exam exam);
|
|
|
+ void AddImage(Image image);
|
|
|
+ void UpdateBatchTask(BatchTask batchTask);
|
|
|
+ }
|
|
|
|
|
|
- protected ScreenshotOptions _snapshotOpts = new ScreenshotOptions() {Type = ScreenshotType.Png };
|
|
|
+ internal abstract class ProbeTask
|
|
|
+ {
|
|
|
public static bool DebugMode { get; set; }
|
|
|
|
|
|
+ private static string _debugFolder = string.Empty;
|
|
|
+
|
|
|
+ protected ScreenshotOptions _snapshotOpts = new ScreenshotOptions() { Type = ScreenshotType.Png };
|
|
|
|
|
|
- public ProbeTask(Database db)
|
|
|
+ protected readonly IExamStore _examStore;
|
|
|
+ public ProbeTask(IExamStore examStore)
|
|
|
{
|
|
|
- _db = db;
|
|
|
+ _examStore = examStore;
|
|
|
}
|
|
|
|
|
|
public static void InitDebugFolder()
|
|
@@ -74,11 +81,11 @@ namespace StationProbe
|
|
|
public abstract Task<ElementCollection> ExecuteAsync(ElementCollection inputs);
|
|
|
}
|
|
|
|
|
|
- internal class LoginTask: ProbeTask
|
|
|
+ internal class LoginTask : ProbeTask
|
|
|
{
|
|
|
private readonly string _loginUrl;
|
|
|
|
|
|
- public LoginTask(Database db, string loginUrl) :base(db)
|
|
|
+ public LoginTask(IExamStore examStore, string loginUrl) : base(examStore)
|
|
|
{
|
|
|
_loginUrl = loginUrl;
|
|
|
}
|
|
@@ -90,7 +97,7 @@ namespace StationProbe
|
|
|
{
|
|
|
await page.GoToAsync(_loginUrl);
|
|
|
|
|
|
- if(DebugMode)
|
|
|
+ if (DebugMode)
|
|
|
{
|
|
|
var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
var fileName = "100000000.jpg";
|
|
@@ -98,9 +105,11 @@ namespace StationProbe
|
|
|
}
|
|
|
|
|
|
//username
|
|
|
- var userElement = await page.WaitForSelectorAsync("input[id=\"userName\"]");
|
|
|
- await userElement.FocusAsync();
|
|
|
- await page.Keyboard.TypeAsync("justin.xing");
|
|
|
+ await using (var userElement = await page.WaitForSelectorAsync("input[id=\"userName\"]"))
|
|
|
+ {
|
|
|
+ await userElement.FocusAsync();
|
|
|
+ await page.Keyboard.TypeAsync("justin.xing");
|
|
|
+ }
|
|
|
|
|
|
if (DebugMode)
|
|
|
{
|
|
@@ -110,9 +119,11 @@ namespace StationProbe
|
|
|
}
|
|
|
|
|
|
//password
|
|
|
- var passwordElement = await page.WaitForSelectorAsync("input[id=\"password\"]");
|
|
|
- await passwordElement.FocusAsync();
|
|
|
- await page.Keyboard.TypeAsync("vinno@123");
|
|
|
+ await using (var passwordElement = await page.WaitForSelectorAsync("input[id=\"password\"]"))
|
|
|
+ {
|
|
|
+ await passwordElement.FocusAsync();
|
|
|
+ await page.Keyboard.TypeAsync("vinno@123");
|
|
|
+ }
|
|
|
|
|
|
if (DebugMode)
|
|
|
{
|
|
@@ -122,9 +133,11 @@ namespace StationProbe
|
|
|
}
|
|
|
|
|
|
//login
|
|
|
- var loginButtonElement = await page.WaitForSelectorAsync("button[b-kvd270uhz9]");
|
|
|
- await loginButtonElement.ClickAsync();
|
|
|
- await page.WaitForNetworkIdleAsync();
|
|
|
+ await using (var loginButtonElement = await page.WaitForSelectorAsync("button[b-kvd270uhz9]"))
|
|
|
+ {
|
|
|
+ await loginButtonElement.ClickAsync();
|
|
|
+ await page.WaitForNetworkIdleAsync();
|
|
|
+ }
|
|
|
|
|
|
if (DebugMode)
|
|
|
{
|
|
@@ -137,9 +150,9 @@ namespace StationProbe
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- internal class MenuTask:ProbeTask
|
|
|
+ internal class MenuTask : ProbeTask
|
|
|
{
|
|
|
- public MenuTask(Database db) : base(db)
|
|
|
+ public MenuTask(IExamStore examStore) : base(examStore)
|
|
|
{
|
|
|
}
|
|
|
|
|
@@ -149,18 +162,17 @@ namespace StationProbe
|
|
|
var page = inputs[ElementType.Page].As<IPage>();
|
|
|
if (page != null)
|
|
|
{
|
|
|
- //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)
|
|
|
+ await using (var menuElement = await page.WaitForSelectorAsync("a[href=\"feedback/list\"]"))
|
|
|
{
|
|
|
- var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
- var fileName = "500000000.jpg";
|
|
|
- SaveDebugSnapshot(fileName, imageData);
|
|
|
+ await menuElement.ClickAsync();
|
|
|
+ if (DebugMode)
|
|
|
+ {
|
|
|
+ var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
+ var fileName = "500000000.jpg";
|
|
|
+ SaveDebugSnapshot(fileName, imageData);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
return inputs;
|
|
|
}
|
|
@@ -175,7 +187,7 @@ namespace StationProbe
|
|
|
|
|
|
public int ExamCount { get; private set; }
|
|
|
|
|
|
- public FilterTask(Database db, DateTime start, DateTime end):base(db)
|
|
|
+ public FilterTask(IExamStore examStore, DateTime start, DateTime end) : base(examStore)
|
|
|
{
|
|
|
_start = start;
|
|
|
_end = end;
|
|
@@ -185,87 +197,96 @@ namespace StationProbe
|
|
|
{
|
|
|
var page = inputs[ElementType.Page].As<IPage>();
|
|
|
//var frame = inputs[ElementType.Frame].As<IFrame>();
|
|
|
- if(page!= null) //&& frame != null)
|
|
|
+ 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)
|
|
|
- {
|
|
|
- var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
- var fileName = "600000000.jpg";
|
|
|
- SaveDebugSnapshot(fileName, imageData);
|
|
|
- }
|
|
|
+ //var filterElements = await page.QuerySelectorAllAsync("div[class=\"me-3 my-1\"]");
|
|
|
+ //var filterElement1 = filterElements[3];
|
|
|
+ //var filterElement2 = filterElements[4];
|
|
|
|
|
|
- //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();
|
|
|
+ ////show filter dialog
|
|
|
+ //if (DebugMode)
|
|
|
+ //{
|
|
|
+ // var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
+ // var fileName = "600000000.jpg";
|
|
|
+ // SaveDebugSnapshot(fileName, imageData);
|
|
|
+ //}
|
|
|
|
|
|
- if (DebugMode)
|
|
|
- {
|
|
|
- var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
- var fileName = "700000000.jpg";
|
|
|
- SaveDebugSnapshot(fileName, imageData);
|
|
|
- }
|
|
|
+ ////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();
|
|
|
|
|
|
- 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();
|
|
|
+ //if (DebugMode)
|
|
|
+ //{
|
|
|
+ // var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
+ // var fileName = "700000000.jpg";
|
|
|
+ // SaveDebugSnapshot(fileName, imageData);
|
|
|
+ //}
|
|
|
|
|
|
- //input end
|
|
|
- if (DebugMode)
|
|
|
- {
|
|
|
- var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
- var fileName = "800000000.jpg";
|
|
|
- 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();
|
|
|
|
|
|
- //await frame.WaitForSelectorAsync("input[_bl_13]");
|
|
|
- //await frame.FocusAsync("input[_bl_13]");
|
|
|
- //await page.Keyboard.TypeAsync("justin.xing");
|
|
|
+ ////input end
|
|
|
+ //if (DebugMode)
|
|
|
+ //{
|
|
|
+ // var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
+ // var fileName = "800000000.jpg";
|
|
|
+ // SaveDebugSnapshot(fileName, imageData);
|
|
|
+ //}
|
|
|
|
|
|
- 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();
|
|
|
+ //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)
|
|
|
+ //if (DebugMode)
|
|
|
+ //{
|
|
|
+ // var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
+ // var fileName = "900000000.jpg";
|
|
|
+ // SaveDebugSnapshot(fileName, imageData);
|
|
|
+ //}
|
|
|
+
|
|
|
+ await using (var pageinationElement = await page.QuerySelectorAsync("div[class=\"table-pagination\"]"))
|
|
|
{
|
|
|
- var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
- var fileName = "900000000.jpg";
|
|
|
- SaveDebugSnapshot(fileName, imageData);
|
|
|
+ await using (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 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);
|
|
|
+ await using (var pagesElement = await page.QuerySelectorAsync("ul[class=\"pagination\"]"))
|
|
|
+ {
|
|
|
+ var pageItemElements = await pagesElement.QuerySelectorAllAsync("li");
|
|
|
+ var lastPageElement = pageItemElements[pageItemElements.Length - 2];
|
|
|
+ await using (var textElement = await lastPageElement.QuerySelectorAsync("a"))
|
|
|
+ {
|
|
|
+ var lastPageStr = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", textElement);
|
|
|
+ PageCount = int.Parse(lastPageStr);
|
|
|
+ }
|
|
|
+ foreach (var pageItemElement in pageItemElements)
|
|
|
+ {
|
|
|
+ await pageItemElement.DisposeAsync();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
return inputs;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- internal class PageTask:ProbeTask
|
|
|
+ internal class PageTask : ProbeTask
|
|
|
{
|
|
|
private readonly int _page;
|
|
|
- public PageTask(Database db, int page):base(db)
|
|
|
+ public PageTask(IExamStore examStore, int page) : base(examStore)
|
|
|
{
|
|
|
_page = page;
|
|
|
}
|
|
@@ -274,24 +295,38 @@ namespace StationProbe
|
|
|
{
|
|
|
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
|
|
|
+ await using (var pagesElement = await page.WaitForSelectorAsync("ul[class=\"pagination\"]"))
|
|
|
{
|
|
|
- break;
|
|
|
+ var pageItemElements = await pagesElement.QuerySelectorAllAsync("li");
|
|
|
+ await using (var currentPageElemment = await pagesElement.QuerySelectorAsync("li[class=\"page-item active\"]"))
|
|
|
+ {
|
|
|
+ await using (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();
|
|
|
+ foreach(var pageItemElement in pageItemElements)
|
|
|
+ {
|
|
|
+ await pageItemElement.DisposeAsync();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ foreach (var pageItemElement in pageItemElements)
|
|
|
+ {
|
|
|
+ await pageItemElement.DisposeAsync();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ await Task.Delay(100);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
|
|
@@ -304,7 +339,7 @@ namespace StationProbe
|
|
|
if (DebugMode)
|
|
|
{
|
|
|
var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
- var fileName = "9" + _page.ToString("D5") +"000.jpg";
|
|
|
+ var fileName = "9" + _page.ToString("D5") + "000.jpg";
|
|
|
SaveDebugSnapshot(fileName, imageData);
|
|
|
}
|
|
|
}
|
|
@@ -312,14 +347,14 @@ namespace StationProbe
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- internal class ExamTask:ProbeTask
|
|
|
+ internal class ExamTask : ProbeTask
|
|
|
{
|
|
|
private readonly int _batchTaskId;
|
|
|
private readonly int _pageIndex;
|
|
|
private readonly int _examIndex;
|
|
|
private readonly int _examIndexInPage;
|
|
|
|
|
|
- public ExamTask(Database db, int batchTaskId, int pageIndex, int examIndex, int examIndexInPage): base(db)
|
|
|
+ public ExamTask(IExamStore examStore, int batchTaskId, int pageIndex, int examIndex, int examIndexInPage) : base(examStore)
|
|
|
{
|
|
|
_batchTaskId = batchTaskId;
|
|
|
_pageIndex = pageIndex;
|
|
@@ -331,24 +366,87 @@ namespace StationProbe
|
|
|
{
|
|
|
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)
|
|
|
+ await using (var pagesElement = await page.WaitForSelectorAsync("ul[class=\"pagination\"]"))
|
|
|
{
|
|
|
- var nextPageElement = pageItemElements[pageItemElements.Length - 1];
|
|
|
- await nextPageElement.ClickAsync();
|
|
|
- await page.WaitForNetworkIdleAsync();
|
|
|
+ var pageItemElements = await pagesElement.QuerySelectorAllAsync("li");
|
|
|
+ await using (var currentPageElemment = await pagesElement.QuerySelectorAsync("li[class=\"page-item active\"]"))
|
|
|
+ {
|
|
|
+ await using (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();
|
|
|
+ foreach (var pageItemElement in pageItemElements)
|
|
|
+ {
|
|
|
+ await pageItemElement.DisposeAsync();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ foreach (var pageItemElement in pageItemElements)
|
|
|
+ {
|
|
|
+ await pageItemElement.DisposeAsync();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
+ await Task.Delay(100);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task EnterExamAsync(IPage page)
|
|
|
+ {
|
|
|
+ await JumpToPageAsync(page);
|
|
|
+ await using (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];
|
|
|
+ await eaxmLinkElement.ClickAsync();
|
|
|
+ foreach(var examLinkElement in examLinkElements)
|
|
|
{
|
|
|
- break;
|
|
|
+ await examLinkElement.DisposeAsync();
|
|
|
}
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
+ private async Task ExitExamAsync(IPage page)
|
|
|
+ {
|
|
|
+ //Wait for the back button.
|
|
|
+ await using (var backButtonElement = await page.WaitForSelectorAsync("button[class=\"btn fix-item feedback-common-button\"]"))
|
|
|
+ {
|
|
|
+ await page.EvaluateFunctionAsync("b => b.click()", backButtonElement);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private async void DoSaveExamImageAsync(IPage page, string examId, int imageIndex, string imageUrl)
|
|
|
+ {
|
|
|
+ var response = await page.WaitForResponseAsync(imageUrl);
|
|
|
+ var imageData = await response.BufferAsync();
|
|
|
+ var image = new Image()
|
|
|
+ {
|
|
|
+ Id = Guid.NewGuid().ToString("N"),
|
|
|
+ ExamId = examId,
|
|
|
+ ImageIndex = imageIndex,
|
|
|
+ Data = imageData,
|
|
|
+ CreateTime = DateTime.Now,
|
|
|
+ };
|
|
|
+ _examStore.AddImage(image);
|
|
|
+ Logger.WriteLine($"Image:{imageUrl} stored.");
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task SaveExamImageAsync(IPage page, string examId, int imageIndex, string imageUrl)
|
|
|
+ {
|
|
|
+ await using (var imagePage = await page.Browser.NewPageAsync())
|
|
|
+ {
|
|
|
+ DoSaveExamImageAsync(imagePage, examId, imageIndex, imageUrl);
|
|
|
+ await imagePage.GoToAsync(imageUrl);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public override async Task<ElementCollection> ExecuteAsync(ElementCollection inputs)
|
|
@@ -357,27 +455,46 @@ namespace StationProbe
|
|
|
//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();
|
|
|
+ var examId = Guid.NewGuid().ToString("N");
|
|
|
+ //First time enter exam.
|
|
|
+ await EnterExamAsync(page);
|
|
|
+ //wait for page loaded.
|
|
|
+ await Task.Delay(1000);
|
|
|
+ //Get all image urls.
|
|
|
+ var imageUrls = new List<string>();
|
|
|
+ await using (var backButtonElement = await page.WaitForSelectorAsync("button[class=\"btn fix-item feedback-common-button\"]"))
|
|
|
+ {
|
|
|
+ var imageDivElements = await page.QuerySelectorAllAsync("div[class=\"bb-img is-preview\"]");
|
|
|
+ if (imageDivElements != null)
|
|
|
+ {
|
|
|
+ foreach (var imageDivElement in imageDivElements)
|
|
|
+ {
|
|
|
+ await using (var imageElement = await imageDivElement.QuerySelectorAsync("img"))
|
|
|
+ {
|
|
|
+ await using (var imageUrl = await imageElement.GetPropertyAsync("src"))
|
|
|
+ {
|
|
|
+ var url = await imageUrl.JsonValueAsync<string>();
|
|
|
+ imageUrls.Add(url);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ await imageDivElement.DisposeAsync();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Logger.WriteLine($"Get image url count:{imageUrls.Count}");
|
|
|
+
|
|
|
+ for (var i = 0; i < imageUrls.Count; i++)
|
|
|
+ {
|
|
|
+ await SaveExamImageAsync(page, examId, i, imageUrls[i]);
|
|
|
+ }
|
|
|
|
|
|
if (DebugMode)
|
|
|
{
|
|
|
var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|
|
|
- var fileName = "9" + _pageIndex.ToString("D5") + _examIndexInPage.ToString("D3") +".jpg";
|
|
|
+ var fileName = "9" + _pageIndex.ToString("D5") + _examIndexInPage.ToString("D3") + ".jpg";
|
|
|
SaveDebugSnapshot(fileName, imageData);
|
|
|
}
|
|
|
|
|
|
- var exmaId = Guid.NewGuid().ToString("N");
|
|
|
-
|
|
|
//Get patient info
|
|
|
//var patientName = "";
|
|
|
var patientSex = "";
|
|
@@ -386,72 +503,28 @@ namespace StationProbe
|
|
|
|
|
|
var report = "";
|
|
|
var reportElements = await page.QuerySelectorAllAsync("div[class=\"col\"]");
|
|
|
- foreach ( var reportElement in reportElements)
|
|
|
+ foreach (var reportElement in reportElements)
|
|
|
{
|
|
|
- var strong = await reportElement.QuerySelectorAsync("strong");
|
|
|
- if(strong != null)
|
|
|
+ await using (var strong = await reportElement.QuerySelectorAsync("strong"))
|
|
|
{
|
|
|
- var content = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", strong);
|
|
|
- report += " " + content;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //Get report
|
|
|
- //var report = "";
|
|
|
-
|
|
|
- //Save images.
|
|
|
- var imageUrls = new List<string>();
|
|
|
- var imageDivElements = await page.QuerySelectorAllAsync("div[class=\"bb-img is-preview\"]");
|
|
|
- if(imageDivElements != null)
|
|
|
- {
|
|
|
- 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) =>
|
|
|
- {
|
|
|
- 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()
|
|
|
+ if (strong != null)
|
|
|
{
|
|
|
- Id = Guid.NewGuid().ToString("N"),
|
|
|
- ExamId = exmaId,
|
|
|
- ImageIndex = i,
|
|
|
- Data = buffer,
|
|
|
- CreateTime = DateTime.Now,
|
|
|
- };
|
|
|
- _db.AddImage(image);
|
|
|
- });
|
|
|
+ var content = await page.EvaluateFunctionAsync<string>("(element) => element.textContent", strong);
|
|
|
+ report += " " + content;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ await reportElement.DisposeAsync();
|
|
|
}
|
|
|
- //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);
|
|
|
- //}
|
|
|
+ Logger.WriteLine($"Get report:{report}");
|
|
|
|
|
|
//Save exam.
|
|
|
var exam = new Exam()
|
|
|
{
|
|
|
- Id = exmaId,
|
|
|
- PatientName = patientName,
|
|
|
+ Id = examId,
|
|
|
+ PatientName = "",
|
|
|
PatientSex = patientSex,
|
|
|
PatientAge = patientAge,
|
|
|
- ExamDate = examDate,
|
|
|
+ ExamDate = DateTime.Now,
|
|
|
Report = report,
|
|
|
BatchTaskId = _batchTaskId,
|
|
|
ExamIndex = _examIndex,
|
|
@@ -459,9 +532,11 @@ namespace StationProbe
|
|
|
ExamIndexInPage = _examIndexInPage,
|
|
|
CreateTime = DateTime.Now
|
|
|
};
|
|
|
- _db.AddExam(exam);
|
|
|
+ _examStore.AddExam(exam);
|
|
|
+
|
|
|
//Back to page.
|
|
|
- await page.GoBackAsync();
|
|
|
+ await ExitExamAsync(page);
|
|
|
+
|
|
|
if (DebugMode)
|
|
|
{
|
|
|
var imageData = await page.ScreenshotDataAsync(_snapshotOpts);
|