From 9be6834d9fa211c1e0d3eb9244bfdf2f742c10a6 Mon Sep 17 00:00:00 2001 From: SeungHo Yang Date: Wed, 9 Jul 2025 23:25:42 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9B=B9=ED=8E=98=EC=9D=B4=EC=A7=80=EA=B0=80?= =?UTF-8?q?=20=ED=99=94=EB=A9=B4=EC=9A=94=EC=86=8C=EA=B0=80=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9B=81checkbox=20=ED=81=B4=EB=A6=AD?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SearchModel/NamguLibrarySearcher.cs | 157 +++++++++++++----- 1 file changed, 113 insertions(+), 44 deletions(-) diff --git a/unimarc/unimarc/SearchModel/NamguLibrarySearcher.cs b/unimarc/unimarc/SearchModel/NamguLibrarySearcher.cs index 52a0173..045cc2c 100644 --- a/unimarc/unimarc/SearchModel/NamguLibrarySearcher.cs +++ b/unimarc/unimarc/SearchModel/NamguLibrarySearcher.cs @@ -8,6 +8,7 @@ using WebDriverManager; using WebDriverManager.DriverConfigs.Impl; using System.IO; using System.Runtime.InteropServices; +using System.Threading; namespace BokBonCheck { @@ -18,29 +19,32 @@ namespace BokBonCheck SiteName = "남구통합도서관(문화정보도서관)"; // 문화관 검색기 } - protected override void SelectLibrary(WebDriverWait wait) + protected override bool SelectLibrary(WebDriverWait wait) { IWebElement searchBox = null; try { var selector = "#clickAll"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == true) + if (searchBox == null) return false; + if (searchBox.Selected == true) { - searchBox.Click(); // 전체체크박스가 체크되어 있으면 클릭해서 해제 + SafeClick(searchBox); } - else return; selector = "#libMA"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == false) + if (searchBox == null) return false; + if (searchBox.Selected == false) { - searchBox.Click(); // 문화관 체크박스 선택 + SafeClick(searchBox); } + + return true; } catch { - + return false; } } } @@ -51,29 +55,32 @@ namespace BokBonCheck SiteName = "남구통합도서관(푸른길도서관)"; } - protected override void SelectLibrary(WebDriverWait wait) + protected override bool SelectLibrary(WebDriverWait wait) { IWebElement searchBox = null; try { var selector = "#clickAll"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == true) + if (searchBox == null) return false; + if (searchBox.Selected == true) { - searchBox.Click(); // 전체체크박스가 체크되어 있으면 클릭해서 해제 + SafeClick(searchBox); } - else return; selector = "#libMB"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == false) + if (searchBox == null) return false; + if (searchBox.Selected == false) { - searchBox.Click(); // 체크박스 선택 + SafeClick(searchBox); } + + return true; } catch { - + return false; } } } @@ -84,29 +91,35 @@ namespace BokBonCheck SiteName = "남구통합도서관(청소년도서관)"; } - protected override void SelectLibrary(WebDriverWait wait) + protected override bool SelectLibrary(WebDriverWait wait) { IWebElement searchBox = null; try { var selector = "#clickAll"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == true) + if (searchBox == null) return false; + if (searchBox.Selected == true) { - searchBox.Click(); // 전체체크박스가 체크되어 있으면 클릭해서 해제 + SafeClick(searchBox); + } - else return; selector = "#libMC"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == false) + if (searchBox == null) return false; + if (searchBox.Selected == false) { - searchBox.Click(); // 체크박스 선택 - } - } - catch - { + //searchBox.Click(); // 체크박스 선택 + SafeClick(searchBox); + } + return true; + } + catch(Exception ex) + { + Console.WriteLine(ex.Message); + return false; } } } @@ -117,29 +130,34 @@ namespace BokBonCheck SiteName = "남구통합도서관(효천어울림도서관)"; } - protected override void SelectLibrary(WebDriverWait wait) + + protected override bool SelectLibrary(WebDriverWait wait) { IWebElement searchBox = null; try { var selector = "#clickAll"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == true) + if (searchBox == null) return false; + if (searchBox.Selected == true) { - searchBox.Click(); // 전체체크박스가 체크되어 있으면 클릭해서 해제 + SafeClick(searchBox); } - else return; + selector = "#libSW"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == false) + if (searchBox == null) return false; + if (searchBox.Selected == false) { - searchBox.Click(); // 체크박스 선택 + SafeClick(searchBox); } + + return true; } catch { - + return false; } } } @@ -150,29 +168,33 @@ namespace BokBonCheck SiteName = "남구통합도서관(스마트도서관)"; } - protected override void SelectLibrary(WebDriverWait wait) + protected override bool SelectLibrary(WebDriverWait wait) { IWebElement searchBox = null; try { var selector = "#clickAll"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == true) + if (searchBox == null) return false; + if ( searchBox.Selected == true) { - searchBox.Click(); // 전체체크박스가 체크되어 있으면 클릭해서 해제 + SafeClick(searchBox); } - else return; + selector = "#libSQ"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == false) + if (searchBox == null) return false; + if (searchBox.Selected == false) { - searchBox.Click(); // 체크박스 선택 + SafeClick(searchBox); } + + return true; } catch { - + return false; } } } @@ -238,22 +260,62 @@ namespace BokBonCheck } - virtual protected void SelectLibrary(WebDriverWait wait) + virtual protected bool SelectLibrary(WebDriverWait wait) { IWebElement searchBox = null; try { var selector = "#clickAll"; searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); - if (searchBox != null && searchBox.Selected == false) + if (searchBox == null) return false; + if (searchBox.Selected == false) { - searchBox.Click(); // 전체체크박스가 해제되어 있으면 클릭해서 선택 + SafeClick(searchBox); } - else return; + return true; + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + return false; + } + } + + protected void SafeClick(IWebElement searchBox) + { + // 안정적인 클릭을 위한 여러 방법 시도 + try + { + // 1. JavaScript로 클릭 시도 + var driver = ((IWrapsDriver)searchBox).WrappedDriver; + ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", searchBox); } catch { - + try + { + // 2. 요소가 보이도록 스크롤 후 클릭 + var driver = ((IWrapsDriver)searchBox).WrappedDriver; + ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", searchBox); + Thread.Sleep(500); + searchBox.Click(); + } + catch + { + try + { + // 3. Actions 클래스 사용 + var driver = ((IWrapsDriver)searchBox).WrappedDriver; + var actions = new OpenQA.Selenium.Interactions.Actions(driver); + actions.MoveToElement(searchBox).Click().Perform(); + } + catch + { + // 4. 마지막 방법: JavaScript로 직접 체크 해제 + var driver = ((IWrapsDriver)searchBox).WrappedDriver; + ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].checked = false;", searchBox); + } + } } } @@ -285,7 +347,13 @@ namespace BokBonCheck //} //대상도서관 선택 - SelectLibrary(wait); + if(SelectLibrary(wait)==false) + { + result.ErrorMessage = "도서관선택실패"; + result.BookCount = -1; + result.IsSuccess = false; + return result; + } // 검색창 찾기 (남구통합도서관 사이트의 특정 선택자 사용) IWebElement searchBox = null; @@ -453,6 +521,7 @@ namespace BokBonCheck } } + // 페이지 변경을 감지하는 메서드 public async Task WaitForPageChange(WebDriverWait wait)