IPEasyUtility.cs 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Dynamic;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Threading;
  10. using NPOI.HPSF;
  11. using OpenQA.Selenium;
  12. using OpenQA.Selenium.Chrome;
  13. using OpenQA.Selenium.Interactions;
  14. using OpenQA.Selenium.Support.Extensions;
  15. using OpenQA.Selenium.Support.UI;
  16. namespace wispro.sp.utility
  17. {
  18. public class IPEasyUtility
  19. {
  20. static string strFileSavePath = ConfigHelper.GetSectionValue("IPEasySetting:DownloadFileSavePath");
  21. static string Account = ConfigHelper.GetSectionValue("IPEasySetting:Account");
  22. static string Password = ConfigHelper.GetSectionValue("IPEasySetting:Password");
  23. static bool WaitForFileDownload(string downloadDir, string fileName, TimeSpan timeout)
  24. {
  25. DateTime startTime = DateTime.Now;
  26. while (DateTime.Now - startTime < timeout)
  27. {
  28. string filePath = Path.Combine(downloadDir, fileName);
  29. if (File.Exists(filePath))
  30. {
  31. // 检查文件是否完成写入(文件大小是否稳定)
  32. long previousSize = 0;
  33. long currentSize = new FileInfo(filePath).Length;
  34. while (previousSize != currentSize)
  35. {
  36. Thread.Sleep(1000); // 等待一段时间
  37. previousSize = currentSize;
  38. currentSize = new FileInfo(filePath).Length;
  39. }
  40. return true; // 文件下载完成
  41. }
  42. Thread.Sleep(1000); // 等待文件出现
  43. }
  44. return false; // 超时,文件未下载完成
  45. }
  46. static IWebElement waitGetElementById(WebDriverWait wait,string id,IWebElement parentElement =null)
  47. {
  48. return wait.Until((d) =>
  49. {
  50. try
  51. {
  52. if (parentElement == null)
  53. {
  54. return d.FindElement(By.Id(id));
  55. }
  56. else
  57. {
  58. return parentElement.FindElement(By.Id(id));
  59. }
  60. }
  61. catch {
  62. return null;
  63. }
  64. });
  65. }
  66. static IWebElement waitGetElementByName(WebDriverWait wait, string name, IWebElement parentElement = null)
  67. {
  68. return wait.Until((d) =>
  69. {
  70. try
  71. {
  72. if (parentElement == null)
  73. {
  74. return d.FindElement(By.Name(name));
  75. }
  76. else
  77. {
  78. return parentElement.FindElement(By.Name(name));
  79. }
  80. }
  81. catch
  82. {
  83. return null;
  84. }
  85. });
  86. }
  87. static IWebElement waitGetElementByTagName(WebDriverWait wait, string name, IWebElement parentElement = null)
  88. {
  89. return wait.Until((d) =>
  90. {
  91. try
  92. {
  93. if (parentElement == null)
  94. {
  95. return d.FindElement(By.TagName(name));
  96. }
  97. else
  98. {
  99. return parentElement.FindElement(By.TagName(name));
  100. }
  101. }
  102. catch
  103. {
  104. return null;
  105. }
  106. });
  107. }
  108. static ReadOnlyCollection<IWebElement> waitGetElementsByName(WebDriverWait wait, string name, IWebElement parentElement = null)
  109. {
  110. return wait.Until((d) =>
  111. {
  112. try
  113. {
  114. if (parentElement == null)
  115. {
  116. return d.FindElements(By.Name(name));
  117. }
  118. else
  119. {
  120. return parentElement.FindElements(By.Name(name));
  121. }
  122. }
  123. catch
  124. {
  125. return null;
  126. }
  127. });
  128. }
  129. static ReadOnlyCollection<IWebElement> waitGetElementsByTagName(WebDriverWait wait, string name, IWebElement parentElement = null)
  130. {
  131. return wait.Until((d) =>
  132. {
  133. try
  134. {
  135. if (parentElement == null)
  136. {
  137. return d.FindElements(By.TagName(name));
  138. }
  139. else
  140. {
  141. return parentElement.FindElements(By.TagName(name));
  142. }
  143. }
  144. catch
  145. {
  146. return null;
  147. }
  148. });
  149. }
  150. static IWebElement waitGetElementByClassName(WebDriverWait wait, string name, IWebElement parentElement = null)
  151. {
  152. return wait.Until((d) =>
  153. {
  154. try
  155. {
  156. if (parentElement == null)
  157. {
  158. return d.FindElement(By.ClassName(name));
  159. }
  160. else
  161. {
  162. return parentElement.FindElement(By.ClassName(name));
  163. }
  164. }
  165. catch
  166. {
  167. return null;
  168. }
  169. });
  170. }
  171. /// <summary>
  172. /// 获取指定案号的专利申请案的基本信息和初稿文件、定稿文件和第一次返稿文件
  173. /// </summary>
  174. /// <param name="caseNo"></param>
  175. /// <returns></returns>
  176. /// <exception cref="Exception"></exception>
  177. public static dynamic DownloadCaseFiles(string caseNo)
  178. {
  179. dynamic retObject = new ExpandoObject();
  180. retObject.CaseNo = caseNo.Trim();
  181. using (IWebDriver driver = CreateChromeDriver())
  182. {
  183. try
  184. {
  185. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(50));
  186. Login(driver, wait);
  187. //点击顶部菜单栏中的案件管理菜单
  188. IWebElement linkCaseManager = waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63");
  189. linkCaseManager.Click();
  190. IWebElement linkCaseSearch = wait.Until((d) =>
  191. {
  192. try
  193. {
  194. return driver.FindElement(By.LinkText("案件查询"));
  195. }
  196. catch
  197. {
  198. return null;
  199. }
  200. });
  201. driver.ExecuteJavaScript("arguments[0].click();", linkCaseSearch);
  202. //linkCaseSearch.Click();
  203. IWebElement patentSearch = waitGetElementByName(wait, "4df7eee3-426f-4ce5-9204-34ccb0fd27f7");
  204. driver.ExecuteJavaScript("arguments[0].click();", patentSearch);
  205. //patentSearch.Click();
  206. driver.SwitchTo().Frame(1);
  207. var inputSearch = waitGetElementById(wait, "case_volume");//driver.FindElement(By.Id("case_volume"));
  208. inputSearch.SendKeys(caseNo.Trim());
  209. var btnSearch = waitGetElementById(wait, "btn_Search");// driver.FindElement(By.Id("btn_Search"));
  210. btnSearch.Click();
  211. try
  212. {
  213. var caseLink = wait.Until((d) => {
  214. return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]"));
  215. });
  216. caseLink.Click();
  217. }
  218. catch(Exception ex)
  219. {
  220. if(ex.Message.Contains("no such element: Unable to locate element"))
  221. {
  222. return retObject;
  223. }
  224. }
  225. System.Threading.Thread.Sleep(1000);
  226. driver.SwitchTo().ParentFrame();
  227. driver.SwitchTo().Frame(2);
  228. //案件名称
  229. retObject.CaseName = waitGetElementById(wait, "p_case_info__case_name").GetAttribute("value");
  230. //我方文号
  231. retObject.CaseNo = waitGetElementById(wait, "p_case_info__case_volume").GetAttribute("value");
  232. //案件类型
  233. retObject.CaseType = waitGetElementById(wait, "p_case_info__case_type_id").GetAttribute("value");
  234. //申请类型
  235. var selectElement = waitGetElementById(wait, "p_case_info__apply_type_id");
  236. retObject.ApplicationType = new SelectElement(selectElement).SelectedOption.Text;
  237. //客户
  238. retObject.Customer = waitGetElementById(wait, "p_case_info__customer_id").GetAttribute("value").Replace("(null)", "");
  239. //申请国家
  240. retObject.Country = waitGetElementById(wait, "p_case_info__country_id").GetAttribute("value");
  241. var table = waitGetElementById(wait, "table_ProcList");
  242. var rows = waitGetElementsByTagName(wait, "tr", table);// table.FindElements(By.TagName("tr"));
  243. foreach (var row in rows)
  244. {
  245. var cells = row.FindElements(By.TagName("td"));
  246. if (cells[1].Text == "新申请")
  247. {
  248. var bthEdit = waitGetElementByClassName(wait, "tbedit", cells[12]);
  249. driver.ExecuteJavaScript("arguments[0].click();", bthEdit);
  250. break;
  251. }
  252. }
  253. driver.SwitchTo().ParentFrame().SwitchTo().Frame(0);
  254. //案件阶段
  255. var caseStage = waitGetElementById(wait, "select2-p_proc_info__review_stage-container");
  256. if (caseStage != null && caseStage.Text != "--请选择--")
  257. {
  258. retObject.CaseStage = caseStage.Text;
  259. }
  260. //内部期限
  261. retObject.InternalDate = waitGetElementById(wait, "p_proc_info__int_due_date").GetAttribute("value");
  262. //处理事项系数
  263. var DICoe = waitGetElementById(wait, "p_proc_info__proc_coefficient_id");
  264. retObject.DoItemCoefficient = new SelectElement(DICoe).SelectedOption.Text;
  265. if (retObject.DoItemCoefficient == "请选择")
  266. {
  267. retObject.DoItemCoefficient = "";
  268. }
  269. retObject.DoPersons = waitGetElementById(wait, "pic_list").GetAttribute("value"); //处理人
  270. retObject.Reviewer = waitGetElementById(wait, "rev_list").GetAttribute("value"); //核稿人
  271. //第一次初稿日
  272. retObject.FirstDraftDate = waitGetElementById(wait, "p_proc_info__first_doc_date").GetAttribute("value");
  273. //客户期限
  274. retObject.CustomerLimitDate = waitGetElementById(wait, "p_proc_info__cus_due_date").GetAttribute("value");
  275. //配案日
  276. retObject.CaseAssigmentDate = waitGetElementById(wait, "p_proc_info__allocate_date").GetAttribute("value");
  277. //返稿日
  278. retObject.ReturnDate = waitGetElementById(wait, "p_proc_info__back_date").GetAttribute("value");
  279. //定稿日
  280. retObject.FinalizationDate = waitGetElementById(wait, "p_proc_info__finish_doc_date").GetAttribute("value");
  281. var lifile = driver.FindElement(By.Id("lifile"));
  282. driver.ExecuteJavaScript("arguments[0].click();", lifile);
  283. //添加从文件清单中获取“新申请第一次内审 (初稿)、 新申请第一次返稿(第一次发客户文档)、新申请文档(定稿文档)”
  284. var table_filelist = waitGetElementById(wait, "table_filelist");
  285. //定稿文件
  286. try
  287. {
  288. Download(retObject, driver, wait, table_filelist, "新申请文档");
  289. }
  290. catch { }
  291. //新申请第一次返稿文件
  292. try
  293. {
  294. Download(retObject, driver, wait, table_filelist, "新申请第一次返稿");
  295. }
  296. catch { }
  297. //初稿文件
  298. try
  299. {
  300. waitGetElementById(wait, "draftfiletoggle").Click();
  301. var table_draffilelist = waitGetElementById(wait, "table_draftfilelist");// driver.FindElement(By.Id("table_draftfilelist"));
  302. Download(retObject, driver, wait, table_draffilelist, "新申请第一次内审");
  303. }
  304. catch { }
  305. }
  306. catch (Exception ex)
  307. {
  308. throw new Exception(ex.Message, ex);
  309. }
  310. finally
  311. {
  312. driver.Quit();
  313. killChromProcess();
  314. }
  315. }
  316. return retObject;
  317. }
  318. private static void Download(dynamic retObject, IWebDriver driver, WebDriverWait wait, IWebElement table_filelist, string fileType)
  319. {
  320. var finallyFile = wait.Until((d) =>
  321. {
  322. try {
  323. return table_filelist.FindElement(By.XPath($"//td[@colname='file_desc'][normalize-space()='{fileType}']"));
  324. }
  325. catch
  326. {
  327. return null;
  328. }
  329. });
  330. if(finallyFile == null)
  331. {
  332. switch (fileType)
  333. {
  334. case "新申请文档":
  335. retObject.finallyFile = null;
  336. break;
  337. case "新申请第一次返稿":
  338. retObject.firstReturnFile = null;
  339. break;
  340. case "新申请第一次内审":
  341. retObject.draftFile = null;
  342. break;
  343. }
  344. return;
  345. }
  346. var tdfileName = wait.Until((d) =>
  347. {
  348. try
  349. {
  350. return finallyFile.FindElement(By.XPath("preceding-sibling::*[2]"));
  351. }
  352. catch
  353. {
  354. return null;
  355. }
  356. });
  357. string fileName = tdfileName.Text;
  358. while (string.IsNullOrEmpty(fileName))
  359. {
  360. System.Threading.Thread.Sleep(100);
  361. fileName = tdfileName.Text;
  362. }
  363. string filePath = System.IO.Path.Combine(strFileSavePath, fileName);
  364. if (System.IO.File.Exists(filePath))
  365. {
  366. System.IO.File.Delete(filePath);
  367. }
  368. switch (fileType)
  369. {
  370. case "新申请文档":
  371. retObject.finallyFile = filePath;
  372. break;
  373. case "新申请第一次返稿":
  374. retObject.firstReturnFile = filePath;
  375. break;
  376. case "新申请第一次内审":
  377. retObject.draftFile = filePath;
  378. break;
  379. }
  380. var btnDownload = finallyFile.FindElement(By.XPath("following-sibling::*[4]"));
  381. btnDownload = waitGetElementByClassName(wait, "tbdownload", btnDownload);
  382. driver.ExecuteJavaScript("arguments[0].click();", btnDownload);
  383. WaitForFileDownload(strFileSavePath, fileName, TimeSpan.FromMinutes(5));
  384. }
  385. private static void Login(IWebDriver driver, WebDriverWait wait)
  386. {
  387. //进入登录界面
  388. driver.Navigate().GoToUrl(ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb"));
  389. //输入用户名和密码
  390. waitGetElementById(wait, "txtUser").SendKeys(Account);
  391. waitGetElementById(wait, "txtPwd").SendKeys(Password);
  392. //点击登录按钮
  393. waitGetElementById(wait, "btnLogin").Click();
  394. //关闭提示遮罩层
  395. waitGetElementById(wait, "jpwClose").Click();
  396. }
  397. public static void DownloadReport(string strId,string filename)
  398. {
  399. using (IWebDriver driver = CreateChromeDriver())
  400. {
  401. try
  402. {
  403. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(50));
  404. Login(driver, wait);
  405. //点击顶部菜单栏中的报表管理菜单
  406. waitGetElementById(wait, "970d33d5-c728-41b8-a060-4330610706b9").Click();
  407. //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9")).Click();
  408. //点击左侧 自定义报表 菜单
  409. waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b").Click();
  410. //driver.FindElement(By.Name("642fa96f-1e1f-46fd-aaa4-cb461ee8df5b")).Click();
  411. //切换到自定义报表Frame
  412. driver.SwitchTo().Frame(1);
  413. //调用报表导出JS
  414. ((IJavaScriptExecutor)driver).ExecuteScript($"Report.Export('{strId}');");
  415. //切换到弹出的导出报表窗口,点击导出按钮
  416. driver.SwitchTo().DefaultContent();
  417. var ihg_export = waitGetElementByName(wait, "ihg_export"); //driver.FindElement(By.Name("ihg_export"));
  418. driver.SwitchTo().Frame(ihg_export);
  419. waitGetElementById(wait, "btnSubmit").Click();
  420. //driver.FindElement(By.Id("btnSubmit")).Click();
  421. WaitForFileDownload(strFileSavePath, filename, TimeSpan.FromMinutes(5));
  422. }
  423. catch (Exception ex)
  424. {
  425. throw new Exception(ex.Message);
  426. }
  427. finally
  428. {
  429. driver.Quit();
  430. driver.Dispose();
  431. killChromProcess();
  432. }
  433. }
  434. }
  435. private static void Log(string strMessage)
  436. {
  437. StreamWriter sw = File.AppendText("c:\\temp\\log.txt");
  438. sw.WriteLine($"{strMessage}");
  439. sw.Flush();
  440. sw.Close();
  441. sw.Dispose();
  442. }
  443. private static OpenQA.Selenium.Chrome.ChromeDriver CreateChromeDriver()
  444. {
  445. bool isheadless = (ConfigHelper.GetSectionValue("IPEasySetting:isHeadless") == "true");
  446. var options = new OpenQA.Selenium.Chrome.ChromeOptions();
  447. options.AddUserProfilePreference("profile.default_content_settings.popups", 0);
  448. options.AddUserProfilePreference("profile.default_content_setting_values.automatic_downloads", 1);
  449. options.AddUserProfilePreference("download.prompt_for_download", false); // 禁止下载提示
  450. options.AddUserProfilePreference("download.default_directory", strFileSavePath);
  451. options.AddUserProfilePreference("intl.accept_languages", "nl");
  452. options.AddUserProfilePreference("disable-popup-blocking", "true");
  453. options.AddUserProfilePreference("safebrowsing.enabled", true);
  454. options.AddArgument($"--unsafely-treat-insecure-origin-as-secure={ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb").Replace("/Login.aspx", "")}");//替换自己的域名,多域名可用逗号分隔。
  455. if (isheadless)
  456. {
  457. options.AddArgument("headless");
  458. }
  459. var driver = new OpenQA.Selenium.Chrome.ChromeDriver(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath"), options);
  460. driver.Manage().Window.Maximize();
  461. driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(50);
  462. driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(100);
  463. return driver;
  464. }
  465. /// <summary>
  466. /// 根据报表名称导出报表
  467. /// </summary>
  468. /// <param name="ReportName">报告名称</param>
  469. /// <param name="isModifyDate">是否手动修改日期范围</param>
  470. public static DataTable DownloadReport(string ReportName,bool isModifyDate)
  471. {
  472. Log($"{DateTime.Now}\t开始下载:{ReportName}");
  473. DataTable retDatatable;
  474. Log($"{DateTime.Now}\t开始启动Chrome");
  475. using (IWebDriver driver = CreateChromeDriver())
  476. {
  477. try
  478. {
  479. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
  480. Login(driver, wait);
  481. //点击顶部菜单栏中的报表管理菜单
  482. Log($"{DateTime.Now}\t点击顶部菜单栏中的报表管理菜单");
  483. var reportMenu = waitGetElementByName(wait, "970d33d5-c728-41b8-a060-4330610706b9");
  484. //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9"));
  485. driver.ExecuteJavaScript("arguments[0].click();", reportMenu);
  486. //点击左侧 自定义报表 菜单
  487. Log($"{DateTime.Now}\t点击左侧 自定义报表 菜单");
  488. var customerReportMenu = waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b");
  489. driver.ExecuteJavaScript("arguments[0].click();", customerReportMenu);
  490. //切换到自定义报表Frame
  491. Log($"{DateTime.Now}\t切换到自定义报表Frame");
  492. driver.SwitchTo().Frame(1);
  493. Log($"{DateTime.Now}\t开始搜索报告");
  494. var inputSearch = waitGetElementById(wait,"customizedList_TxtSheetSearchKey");
  495. Log($"{DateTime.Now}\t在搜索框中输入报告名称");
  496. inputSearch.SendKeys(ReportName);
  497. Log($"{DateTime.Now}\t点击搜索按钮");
  498. var btnSearch = waitGetElementByClassName(wait,"btn-search");
  499. btnSearch.Click();
  500. Log($"{DateTime.Now}\t选中报告");
  501. var reportRecord = wait.Until((d) =>
  502. {
  503. try
  504. {
  505. return d.FindElement(By.XPath($"//td[contains(text(),'{ReportName}')]"));
  506. }
  507. catch
  508. {
  509. return null;
  510. }
  511. });
  512. reportRecord.Click();
  513. if (isModifyDate)
  514. {
  515. Log($"{DateTime.Now}\t点击编辑");
  516. var btnEdit = waitGetElementByClassName(wait,"edit");
  517. btnEdit.Click();
  518. Log($"{DateTime.Now}\t清除以选择的处理事项完成日条件");
  519. try
  520. {
  521. var doItemFinished = wait.Until((d) => {
  522. return d.FindElement(By.XPath("//span[contains(@objcvalue,'_date') and contains(@id,'ST;')]"));
  523. });
  524. doItemFinished.Click();
  525. }
  526. catch { }
  527. Log($"{DateTime.Now}\t输入处理事项完成日期:开始日期");
  528. var startDate = wait.Until((d) => {
  529. return d.FindElement(By.XPath("//input[contains(@id,'dt_s_')]"));
  530. });
  531. startDate.Click();
  532. startDate.SendKeys(new DateTime(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month, 1).ToString("yyyy-MM-dd"));
  533. Log($"{DateTime.Now}\t输入处理事项完成日期:结束日期");
  534. var endDate = wait.Until((d) =>
  535. {
  536. try
  537. {
  538. return d.FindElement(By.XPath("//input[contains(@id,'dt_e_')]"));//.Id("dt_e_4F8FE88D-9040-45F1-9723-45699BCD4CAF"));
  539. }
  540. catch
  541. {
  542. return null;
  543. }
  544. });
  545. endDate.Click();
  546. endDate.SendKeys(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1).ToString("yyyy-MM-dd"));
  547. Log($"{DateTime.Now}\t添加处理事项检索条件");
  548. var addDate = wait.Until((d) =>
  549. {
  550. try
  551. {
  552. return d.FindElement(By.XPath("//a[contains(@onclick,'ReportSub.ConditionDTSelect')]"));
  553. }
  554. catch
  555. {
  556. return null;
  557. }
  558. });
  559. addDate.Click();
  560. //System.Threading.Thread.Sleep(500);
  561. Log($"{DateTime.Now}\t保存检索条件");
  562. var btnSave = waitGetElementById(wait, "save"); // driver.FindElement(By.Id("save"));
  563. btnSave.Click();
  564. //System.Threading.Thread.Sleep(3000);
  565. }
  566. Log($"{DateTime.Now}\t点击导出Excel链接");
  567. var linkExport = wait.Until((d) =>
  568. {
  569. try
  570. {
  571. return d.FindElement(By.XPath("//a[contains(@onclick,'-') and @class='tbexcel']"));
  572. }
  573. catch
  574. {
  575. return null;
  576. }
  577. });
  578. linkExport.Click();
  579. //切换到弹出的导出报表窗口,点击导出按钮
  580. Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮");
  581. driver.SwitchTo().DefaultContent();
  582. var ihg_export = driver.FindElement(By.Name("ihg_export"));
  583. driver.SwitchTo().Frame(ihg_export);
  584. waitGetElementById(wait, "btnSubmit").Click();
  585. //切换到弹出的下载报表界面,点击下载按钮
  586. Log($"{DateTime.Now}\t切换到弹出的下载报表界面,点击下载按钮");
  587. //System.Threading.Thread.Sleep(3000);
  588. driver.SwitchTo().DefaultContent();
  589. var frameDownload = waitGetElementByName(wait,"DownloadList");
  590. driver.SwitchTo().Frame(frameDownload);
  591. var firstTr = waitGetElementByTagName(wait,"tr");
  592. var tdStatus = firstTr.FindElement(By.XPath("//td")).FindElement(By.XPath("following-sibling::td[4]"));
  593. string strStatus = tdStatus.Text;
  594. while (strStatus.Trim() != "导出成功!")
  595. {
  596. if (strStatus.Trim() == "导出失败,请稍后重试!")
  597. {
  598. return null;
  599. }
  600. System.Threading.Thread.Sleep(5000);
  601. firstTr = waitGetElementByTagName(wait, "tr");
  602. tdStatus = firstTr.FindElement(By.XPath("//td")).FindElement(By.XPath("following-sibling::td[4]"));
  603. strStatus = tdStatus.Text;
  604. }
  605. Log($"{DateTime.Now}\t点击下载按钮下载文档");
  606. firstTr = waitGetElementByTagName(wait, "tr");
  607. firstTr.FindElement(By.XPath("//td/a[@title='下载']")).Click();
  608. //System.Threading.Thread.Sleep(5000);
  609. //btnDownload.Click();
  610. string strFilePath = System.IO.Path.Combine(strFileSavePath, $"{ReportName.Trim()}.xlsx");
  611. WaitForFileDownload(strFileSavePath, $"{ReportName.Trim()}.xlsx", TimeSpan.FromMinutes(5));
  612. //删除下载记录
  613. Log($"{DateTime.Now}\t删除下载记录");
  614. firstTr = waitGetElementByTagName(wait, "tr");// driver.FindElement(By.TagName("tr"));
  615. firstTr.FindElement(By.XPath("//td/a[@title='删除']")).Click();
  616. //System.IO.FileInfo file = new System.IO.FileInfo(strFilePath.Replace("~", "_"));
  617. retDatatable = NPOIExcel.ExcelToDataTable(strFilePath.Replace("~", "_"), true);
  618. System.IO.File.Delete(strFilePath.Replace("~", "_"));
  619. }
  620. catch (Exception ex)
  621. {
  622. Log(ex.ToString());
  623. throw new Exception(ex.Message, ex);
  624. }
  625. finally
  626. {
  627. Log("关闭Chrome");
  628. driver.Quit();
  629. driver.Dispose();
  630. killChromProcess();
  631. }
  632. }
  633. Log($"{DateTime.Now}\t返回数据");
  634. return retDatatable;
  635. }
  636. /// <summary>
  637. /// 获取案件基本信息
  638. /// </summary>
  639. /// <param name="caseNo">我方文号</param>
  640. /// <returns></returns>
  641. public static dynamic GetCaseInfo(string caseNo)
  642. {
  643. dynamic retObject = new ExpandoObject();
  644. retObject.CaseNo = caseNo.Trim();
  645. using (IWebDriver driver = CreateChromeDriver())
  646. {
  647. try
  648. {
  649. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
  650. Login(driver, wait);
  651. //点击顶部菜单栏中的案件管理菜单
  652. waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  653. //点击左侧 查询 菜单
  654. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  655. //切换到自定义报表Frame
  656. driver.SwitchTo().Frame(1);
  657. var inputSearch = waitGetElementById(wait,"case_volume");
  658. inputSearch.SendKeys(caseNo.Trim());
  659. var btnSearch = waitGetElementById(wait, "btn_Search");
  660. btnSearch.Click();
  661. var caseLink = wait.Until((d) => {
  662. return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]"));
  663. });
  664. caseLink.Click();
  665. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  666. //等待页面上ID属性值为submitButton的元素加载完成
  667. IWebElement myElement = wait.Until((d) =>
  668. {
  669. try
  670. {
  671. return d.FindElement(By.Id("libase"));
  672. }
  673. catch {
  674. return null;
  675. }
  676. });
  677. myElement.Click();
  678. //driver.FindElement(By.Id("libase")).Click();
  679. retObject.CaseName = driver.FindElement(By.Id("p_case_info__case_name")).GetAttribute("value"); //案件名称
  680. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  681. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  682. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  683. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  684. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  685. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  686. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  687. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  688. //select[@id='p_case_info__case_coefficient_id']
  689. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  690. }
  691. catch (Exception ex)
  692. {
  693. throw new Exception(ex.Message, ex);
  694. }
  695. finally
  696. {
  697. driver.Quit();
  698. killChromProcess();
  699. }
  700. }
  701. return retObject;
  702. }
  703. public static dynamic GetPerformanceRecord(string caseNo, List<string> doItemNames)
  704. {
  705. dynamic retObject = new ExpandoObject();
  706. retObject.CaseNo = caseNo.Trim();
  707. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  708. {
  709. Service.Start();
  710. using (IWebDriver driver = CreateChromeDriver())
  711. {
  712. try
  713. {
  714. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
  715. Login(driver,wait);
  716. //点击顶部菜单栏中的案件管理菜单
  717. waitGetElementByName(wait,"71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  718. //点击左侧 查询 菜单
  719. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  720. driver.SwitchTo().Frame(1);
  721. var inputSearch = wait.Until((d) =>
  722. {
  723. try
  724. {
  725. //切换到自定义报表Frame
  726. return d.FindElement(By.Id("case_volume"));
  727. }
  728. catch
  729. {
  730. return null;
  731. }
  732. });
  733. inputSearch.SendKeys(caseNo.Trim());
  734. var btnSearch = waitGetElementById(wait,"btn_Search");
  735. btnSearch.Click();
  736. var caseLink = wait.Until((d) =>
  737. {
  738. try
  739. {
  740. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  741. }
  742. catch
  743. {
  744. return null;
  745. }
  746. });
  747. caseLink = driver.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  748. caseLink.Click();
  749. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  750. IWebElement temDoItemLink = null;
  751. string temFinishedDate = "";
  752. foreach (string doItemName in doItemNames)
  753. {
  754. var DoItemLinks = wait.Until((d) =>
  755. {
  756. return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  757. });
  758. if (DoItemLinks.Count > 0)
  759. {
  760. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  761. if (string.IsNullOrEmpty(temFinishedDate))
  762. {
  763. temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text;
  764. temDoItemLink = DoItemLink;
  765. }
  766. else
  767. {
  768. if (DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text.CompareTo(temFinishedDate) > 0)
  769. {
  770. temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text;
  771. temDoItemLink = DoItemLink;
  772. }
  773. }
  774. }
  775. }
  776. if(temDoItemLink != null)
  777. {
  778. retObject.CaseStage = temDoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  779. retObject.DoItemState = temDoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  780. retObject.InternalDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  781. retObject.CustomerLimitDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  782. retObject.FinishedDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  783. retObject.DoPersons = temDoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  784. retObject.DoItemMemo = temDoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  785. retObject.Reviewer = temDoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  786. retObject.DoItem = temDoItemLink.Text;
  787. //temDoItemLink = DoItemLink;
  788. temDoItemLink.Click();
  789. }
  790. else
  791. {
  792. throw new ApplicationException("处理事项不存在!");
  793. }
  794. var p_proc_finish_doc_date = wait.Until((d) =>
  795. {
  796. try
  797. {
  798. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  799. }
  800. catch
  801. {
  802. return null;
  803. }
  804. });
  805. //System.Threading.Thread.Sleep(500);
  806. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  807. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  808. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  809. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  810. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  811. driver.FindElement(By.Id("libase")).Click();
  812. var p_case_info__case_name = wait.Until((d) =>
  813. {
  814. try
  815. {
  816. return d.FindElement(By.Id("p_case_info__case_name"));
  817. }
  818. catch
  819. {
  820. return null;
  821. }
  822. });
  823. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  824. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  825. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  826. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  827. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  828. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  829. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  830. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  831. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  832. //select[@id='p_case_info__case_coefficient_id']
  833. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  834. }
  835. catch (Exception ex)
  836. {
  837. throw new Exception(ex.Message, ex);
  838. }
  839. finally
  840. {
  841. driver.Quit();
  842. killChromProcess();
  843. }
  844. }
  845. Service.Dispose();
  846. }
  847. return retObject;
  848. }
  849. /// <summary>
  850. /// 获取案件处理事项记录
  851. /// </summary>
  852. /// <param name="caseNo">我方文号</param>
  853. /// <param name="doItemName">处理事项</param>
  854. /// <returns></returns>
  855. public static dynamic GetPerformanceRecord(string caseNo,string doItemName,string caseStage=null)
  856. {
  857. if (caseNo.StartsWith("APCN"))
  858. {
  859. //商标
  860. return GetAPCNPerformanceRecord(caseNo, doItemName, caseStage);
  861. }
  862. dynamic retObject = new ExpandoObject();
  863. retObject.CaseNo = caseNo.Trim();
  864. retObject.DoItem = doItemName;
  865. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  866. {
  867. Service.Start();
  868. using (IWebDriver driver = CreateChromeDriver())
  869. {
  870. try
  871. {
  872. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
  873. Login(driver, wait);
  874. //点击顶部菜单栏中的案件管理菜单
  875. waitGetElementByName(wait,"71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  876. //点击左侧 查询 菜单
  877. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  878. driver.SwitchTo().Frame(1);
  879. var inputSearch = wait.Until((d) =>
  880. {
  881. try
  882. {
  883. return d.FindElement(By.Id("case_volume"));
  884. }
  885. catch
  886. {
  887. return null;
  888. }
  889. });
  890. inputSearch.SendKeys(caseNo.Trim());
  891. var btnSearch = waitGetElementById(wait,"btn_Search");
  892. btnSearch.Click();
  893. var caseLink = wait.Until((d) =>
  894. {
  895. try
  896. {
  897. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  898. }
  899. catch
  900. {
  901. return null;
  902. }
  903. });
  904. caseLink.Click();
  905. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  906. var DoItemLinks = wait.Until((d) => {
  907. return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  908. });
  909. if (DoItemLinks.Count > 0)
  910. {
  911. if (!string.IsNullOrEmpty(caseStage))
  912. {
  913. foreach (var DoItemLink in DoItemLinks)
  914. {
  915. var temCaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text;
  916. if (temCaseStage == caseStage)
  917. {
  918. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  919. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  920. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  921. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  922. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  923. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  924. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  925. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  926. DoItemLink.Click();
  927. break;
  928. }
  929. }
  930. }
  931. else
  932. {
  933. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  934. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  935. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  936. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  937. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  938. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  939. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  940. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  941. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  942. DoItemLink.Click();
  943. }
  944. }
  945. var p_proc_finish_doc_date = wait.Until((d) =>
  946. {
  947. try
  948. {
  949. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  950. }
  951. catch
  952. {
  953. return null;
  954. }
  955. });
  956. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  957. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  958. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  959. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  960. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  961. waitGetElementById(wait, "libase").Click();
  962. var p_case_info__case_name = wait.Until((d) =>
  963. {
  964. try
  965. {
  966. return d.FindElement(By.Id("p_case_info__case_name"));
  967. }
  968. catch
  969. {
  970. return null;
  971. }
  972. });
  973. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  974. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  975. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  976. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  977. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  978. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  979. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  980. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  981. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  982. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  983. }
  984. catch (Exception ex)
  985. {
  986. throw new Exception(ex.Message, ex);
  987. }
  988. finally
  989. {
  990. driver.Quit();
  991. killChromProcess();
  992. }
  993. }
  994. Service.Dispose();
  995. }
  996. return retObject;
  997. }
  998. private static dynamic GetAPCNPerformanceRecord(string caseNo, string doItemName, string caseStage = null)
  999. {
  1000. dynamic retObject = new ExpandoObject();
  1001. retObject.CaseNo = caseNo.Trim();
  1002. retObject.DoItem = doItemName;
  1003. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  1004. {
  1005. Service.Start();
  1006. using (IWebDriver driver = CreateChromeDriver())
  1007. {
  1008. try
  1009. {
  1010. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
  1011. Login(driver, wait);
  1012. //点击顶部菜单栏中的案件管理菜单
  1013. driver.FindElement(By.Name("71A7CC35-F597-40E1-9FEF-BE622A3A3B63")).Click();
  1014. System.Threading.Thread.Sleep(500);
  1015. //点击左侧 查询 菜单
  1016. driver.FindElement(By.Name("FF4E1FF9-FE36-4F0F-99DF-81E60817722E")).Click();
  1017. driver.SwitchTo().Frame(1);
  1018. var inputSearch = wait.Until((d) =>
  1019. {
  1020. try
  1021. {
  1022. //切换到自定义报表Frame
  1023. return d.FindElement(By.Id("case_volume"));
  1024. }
  1025. catch
  1026. {
  1027. return null;
  1028. }
  1029. });
  1030. inputSearch.SendKeys(caseNo.Trim());
  1031. var btnSearch = waitGetElementById(wait,"btn_Search");
  1032. btnSearch.Click();
  1033. var caseLink = wait.Until((d) =>
  1034. {
  1035. try
  1036. {
  1037. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  1038. }
  1039. catch
  1040. {
  1041. return null;
  1042. }
  1043. });
  1044. caseLink.Click();
  1045. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  1046. var DoItemLinks = wait.Until((d) => {
  1047. return driver.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  1048. });
  1049. if (DoItemLinks.Count > 0)
  1050. {
  1051. if (!string.IsNullOrEmpty(caseStage))
  1052. {
  1053. foreach (var DoItemLink in DoItemLinks)
  1054. {
  1055. var temCaseStage = wait.Until((d) => {
  1056. return DoItemLink.FindElement(By.XPath("following-sibling::td[1]"));
  1057. }).Text;
  1058. if (temCaseStage == caseStage)
  1059. {
  1060. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1061. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  1062. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  1063. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  1064. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  1065. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  1066. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  1067. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1068. DoItemLink.Click();
  1069. //driver.ExecuteJavaScript("$(arguments[0]).click()", DoItemLink);
  1070. break;
  1071. }
  1072. }
  1073. }
  1074. else
  1075. {
  1076. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  1077. //retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1078. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //处理事项处理状态
  1079. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[3]")).Text; //内部期限
  1080. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //客户期限
  1081. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[6]")).Text; //处理事项完成日
  1082. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理人
  1083. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //处理事项备注
  1084. //retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1085. DoItemLink.Click();
  1086. //new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(DoItemLink)).Click();
  1087. }
  1088. }
  1089. var p_proc_finish_doc_date = wait.Until((d) =>
  1090. {
  1091. try
  1092. {
  1093. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  1094. }
  1095. catch
  1096. {
  1097. return null;
  1098. }
  1099. });
  1100. //System.Threading.Thread.Sleep(500);
  1101. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  1102. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  1103. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  1104. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  1105. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  1106. waitGetElementById(wait,"libase").Click();
  1107. var p_case_info__case_name = wait.Until((d) =>
  1108. {
  1109. try
  1110. {
  1111. return d.FindElement(By.Id("p_case_info__case_name"));
  1112. }
  1113. catch
  1114. {
  1115. return null;
  1116. }
  1117. });
  1118. //System.Threading.Thread.Sleep(500);
  1119. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  1120. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  1121. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  1122. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  1123. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  1124. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  1125. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  1126. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  1127. //driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  1128. //select[@id='p_case_info__case_coefficient_id']
  1129. //retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  1130. }
  1131. catch (Exception ex)
  1132. {
  1133. throw new Exception(ex.Message, ex);
  1134. }
  1135. finally
  1136. {
  1137. driver.Quit();
  1138. killChromProcess();
  1139. }
  1140. }
  1141. Service.Dispose();
  1142. }
  1143. return retObject;
  1144. }
  1145. private static void killChromProcess()
  1146. {
  1147. try
  1148. {
  1149. Process[] workers = Process.GetProcessesByName("Chrome");
  1150. foreach (Process worker in workers)
  1151. {
  1152. worker.Kill();
  1153. worker.WaitForExit();
  1154. worker.Dispose();
  1155. }
  1156. workers = Process.GetProcessesByName("Chromedriver");
  1157. foreach (Process worker in workers)
  1158. {
  1159. worker.Kill();
  1160. worker.WaitForExit();
  1161. worker.Dispose();
  1162. }
  1163. }
  1164. catch { }
  1165. }
  1166. private static string GetSelectText(IWebElement element)
  1167. {
  1168. var strValue = element.GetAttribute("value");
  1169. if (string.IsNullOrEmpty(strValue))
  1170. {
  1171. return null;
  1172. }
  1173. var ops = element.FindElements(By.TagName("option"));
  1174. foreach (var op in ops)
  1175. {
  1176. if (op.GetAttribute("value") == strValue)
  1177. {
  1178. return op.Text;
  1179. }
  1180. }
  1181. return null;
  1182. }
  1183. }
  1184. }