示例#1
0
        public override void Execute(WorkNodeArgment arg)
        {
            // 작업노드 시작시 수행루틴
            arg.cbOnChangeWorkState(arg.prevType, m_type, "");
            ChromeDriver driver = arg.seleMgr.GetDriver();

            Util.Logger logger = arg.logger;

            try
            {
                // 로그인 화면 버튼 찾아서 클릭
                var element = driver.FindElementByCssSelector(".d:nth-child(3) > div > .i");
                element.Click();
                Thread.Sleep(2000);

                // id, pw 입력
                element = driver.FindElementById("emailAddress-input");
                element.SendKeys("*****@*****.**");
                Thread.Sleep(100);

                // 로그인 클릭
                element = driver.FindElementById("password-input");
                element.SendKeys("!8189809goD");
                Thread.Sleep(100);

                // 로그인 클릭
                element = driver.FindElementById("login-button");
                element.Click();
                Thread.Sleep(3000);

                // 메인화면으로 이동
                element = driver.FindElementByXPath("//*[@id=\"__next\"]/div/header/div/div/a[1]");
                element.Click();
                Thread.Sleep(3000);
            }
            catch (Exception e)
            {
                arg.cbOnErrorWorkNode(m_type, "로그인 수행 실패");
                logger.OutputError(e.StackTrace, e.Message);
                return;
            }

            // 다음작업으로 이동
            arg.prevType = m_type;
            m_workManager.GoNextWork(TYPE_WORK.ClearCart, arg);
        }
示例#2
0
        public override void Execute(WorkNodeArgment arg)
        {
            // 작업노드 시작시 수행루틴
            arg.cbOnChangeWorkState(arg.prevType, m_type, "");
            ChromeDriver driver = arg.seleMgr.GetDriver();

            Util.Logger logger = arg.logger;

            // 작업수행
            try
            {
                // 장바구니로 이동
                var element = driver.FindElementByXPath("/html/body/div[2]/div/header/div[2]/div/div/nav/ul/li[4]/a");
                element.Click();
                Thread.Sleep(6000);

                // 장바구니에 물건이 있으면 장바구니 비우기
                if (arg.seleMgr.ExistElement(By.XPath("/html/body/div[2]/div/header/div[2]/div/div/nav/ul/li[4]/a/span")))
                {
                    // 장바구니 마크에 쓰여진 숫자로 판별
                    element = driver.FindElementByXPath("/html/body/div[2]/div/header/div[2]/div/div/nav/ul/li[4]/a/span");
                    Thread.Sleep(100);
                    int cntBuyGroup = int.Parse(element.Text);

                    // 장바구니 품목 그룹이 1개 있을경우와 여러개 있을경우 html 이 다르므로, 다르게 처리함
                    if (1 == cntBuyGroup)
                    {
                        element = driver.FindElementByXPath("/html/body/div[2]/div/div[5]/div/div/div/div[5]/div[2]/div/div/span/button");
                        element.Click();
                        Thread.Sleep(6000);
                    }
                    else
                    {
                        ReadOnlyCollection <IWebElement> listElem = driver.FindElementsByXPath("/html/body/div[2]/div/div[5]/div/div/div/div[5]/div[2]/div");
                        Thread.Sleep(100);
                        cntBuyGroup = listElem.Count;

                        // 1개 그룹 빼고 나머지 처리한후 최종적으로 1개 그룹 비움
                        for (int i = 0; i < cntBuyGroup - 1; i++)
                        {
                            var elemSel = driver.FindElementByXPath("/html/body/div[2]/div/div[5]/div/div/div/div[5]/div[2]/div[1]/div/span/button");
                            elemSel.Click();
                            Thread.Sleep(6000);
                        }

                        element = driver.FindElementByXPath("/html/body/div[2]/div/div[5]/div/div/div/div[5]/div[2]/div/div/span/button");
                        element.Click();
                        Thread.Sleep(6000);
                    }
                }

                // 메인이동
                driver.FindElementByXPath("/html/body/div[2]/div/header/div[2]/div/div/a").Click();
                Thread.Sleep(3000);
            }
            catch (Exception e)
            {
                arg.cbOnErrorWorkNode(m_type, "장바구니 비우기 실패");
                logger.OutputError(e.StackTrace, e.Message);
                return;
            }

            // 다음 작업으로 이동
            arg.prevType = m_type;
            m_workManager.GoNextWork(TYPE_WORK.CheckOrderItem, arg);
        }
示例#3
0
        public override void Execute(WorkNodeArgment arg)
        {
            // 작업노드 시작시 수행루틴
            arg.cbOnChangeWorkState(arg.prevType, m_type, "");
            ChromeDriver driver = arg.seleMgr.GetDriver();

            Util.Logger logger = arg.logger;

            // 작업수행
            //OrderItem orderItem = arg.orderData[0];

            string serialNum = arg.orderData.listSerial[0];
            string productCD = "p" + arg.orderData.listCode[0];
            int    cntBuy    = int.Parse(arg.orderData.listAmount[0]);

            try
            {
                // 검색창 깨끗이 지우고
                if (arg.seleMgr.ExistElement(By.XPath("/html/body/div[2]/div/header/div[2]/div/div/div/div/div/div/form/div[1]/button[1]")))
                {
                    driver.FindElementByXPath("/html/body/div[2]/div/header/div[2]/div/div/div/div/div/div/form/div[1]/button[1]").Click();
                }
                Thread.Sleep(100);

                // 검색어 입력
                var element = driver.FindElementByXPath("//*[@id=\"input-search-input-field\"]");
                element.SendKeys(productCD);
                Thread.Sleep(100);

                // 검색 버튼 클릭
                element = driver.FindElementByXPath("//*[@id=\"app\"]/div/header/div[2]/div/div/div/div/div/div/form/div[1]/button[2]");
                element.Click();
                Thread.Sleep(5000);

                // 검색 결과중 첫번째 것 가져와서 href 링크에 제품코드가 들어 있다면 검색 성공
                // 검색에 성공하면 필요한 개수만큼 장바구니에 담음
                ReadOnlyCollection <IWebElement> listElem = driver.FindElementsByXPath("//*[@id=\"app\"]/div/div[5]/div/div/div/div[2]/div/div[2]/div/div/div/div/div");

                // 검색결과가 없다는 것은 제품이 등록되지 않은 것임
                // 장바구니에 담기 실패
                if (0 == listElem.Count)
                {
                    ProcessAfterOrder(arg, serialNum, cntBuy);
                    return;
                }

                int idxExist = -1;
                // 해당물건이 여러개일 경우 정확한 물건을 찾음
                for (int i = 0; i < listElem.Count; i++)
                {
                    var    elemSel = listElem[0].FindElement(By.CssSelector("div > div > a"));
                    string href    = elemSel.GetAttribute("href");
                    // 정확한 코드를 포함한 제품을 찾음 12라는 코드를 찾으려고 하는데 123.html도 12를 포함하므로 위험함
                    if (href.Contains(productCD + ".html"))
                    {
                        idxExist = i;
                        break;
                    }
                }

                if (-1 == idxExist)
                {
                    ProcessAfterOrder(arg, serialNum, cntBuy);
                    return;
                }

                string strXPath = "/html/body/div[2]/div/div[5]/div/div/div/div[2]/div/div[2]/div/div/div/div/div/div/div[" + (idxExist + 1).ToString() + "]/a";

                // 상세 주문으로 이동
                element = driver.FindElementByXPath(strXPath);
                element.Click();
                Thread.Sleep(4000);

                // 제품이미지 확대 화면이 갯수 리스트를 가리므로 마우스를 이동시켜서 확대화면 없앰
                arg.seleMgr.MouseMoveToElement(By.XPath("/html/body/div[2]/div/header/div[2]/div/div/a"));

                // 기존에 장바구니에 담겨있던 제품 갯수
                int cntExistCartItem = 0;
                if (arg.seleMgr.ExistElement(By.XPath("/html/body/div[2]/div/header/div[2]/div/div/nav/ul/li[4]/a/span")))
                {
                    element          = driver.FindElementByXPath("/html/body/div[2]/div/header/div[2]/div/div/nav/ul/li[4]/a/span");
                    cntExistCartItem = int.Parse(element.Text);
                }

                // 개수만큼 장바구니에 담기
                // 리스트에 출력된 갯수들의 리스트에서 가장 최소한의 클릭으로 담을수 있을만큼 담음
                listElem = driver.FindElementsByXPath("/html/body/div[2]/div/div[5]/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[2]/div[1]/select/option");

                // 1,2,4,10,15 같은 개수의 리스트 인데
                List <int> listAmount = new List <int>();
                for (int i = 0; i < listElem.Count; i++)
                {
                    listAmount.Add(int.Parse(listElem[i].Text));
                }

                // 여기서 출력 개수 리스트가 없다는 것은 재고가 없다는 이야기임
                if (0 == listAmount.Count)
                {
                    ProcessAfterOrder(arg, serialNum, cntBuy);
                    return;
                }

                // 최소한의 루프를 돌아야 하므로 100회면 충분히 돌것으로 판단됨.
                for (int i = 0; i < 100; i++)
                {
                    // 리스트에 포함된 최대개수부터 나누었을때, 1 이상이 나오면 해당 갯수로 담을수 있게 처리함
                    for (int j = listAmount.Count - 1; j >= 0; j--)
                    {
                        int cntOrder = listAmount[j];
                        if (cntBuy / cntOrder > 0)
                        {
                            SelectElement select = new SelectElement(driver.FindElementByXPath("/html/body/div[2]/div/div[5]/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[2]/div[1]/select"));

                            // 갯수창 선택해서 리스트를 보이게 하고 리스트에서 선택후 장바구니 담기
                            select.SelectByIndex(j);
                            Thread.Sleep(100);

                            element = driver.FindElementByXPath("/html/body/div[2]/div/div[5]/div[2]/div/div[2]/div[1]/div[3]/div[2]/div[2]/div[2]/button");
                            element.Click();
                            Thread.Sleep(4000);

                            // 만일 물건 갯수 만큼 장바구니에서의 개수가 증가하지 않았다면 오류로 보고 처리
                            element = driver.FindElementByXPath("/html/body/div[2]/div/header/div[2]/div/div/nav/ul/li[4]/a/span");
                            int cntAfterCartBuy = int.Parse(element.Text);

                            if ((cntExistCartItem + cntOrder) == cntAfterCartBuy)
                            {
                                // 주문이 제대로 들어갈 경우
                                cntExistCartItem += cntOrder;
                                cntBuy           -= cntOrder;
                            }
                            else
                            {
                                // 장바구니에 담기 실패
                                ProcessAfterOrder(arg, serialNum, cntBuy);
                                return;
                            }

                            // 다음 담을 갯수로 넘어가기
                            break;
                        }
                    }

                    if (0 == cntBuy)
                    {
                        // 성공적으로 주문 완료
                        ProcessAfterOrder(arg, serialNum, cntBuy);
                        return;
                    }
                }
            }
            catch (Exception e)
            {
                arg.cbOnErrorWorkNode(m_type, "장바구니에 담기 실패");
                logger.OutputError(e.StackTrace, e.Message);
                return;
            }
        }