본문 바로가기
Programming/C#

C# 셀레니움 - 웹기반 출근퇴근 자동으로 하기 - 2 버튼 클릭

by Pendine 2021. 6. 15.
728x90
        private void Checkinfo_Button_Click(object sender, EventArgs e)
        {
            //MessageBox.Show("Hello World!");

            MessageBox.Show("INPUT INFO \n ID : " + IdText.Text + " PASSWORD : " + PassText.Text
                + "\n attend start : " + workStartT1.Text+" attend end : " + workStartT2.Text
                + "\n leave start : " + offWorkT1.Text +" leave end : " + offWorkT2.Text 
                + "\n 비밀번호는 로그, 저장자료에 기록되지 않습니다."
                , "입력정보 확인"
                );
            //Console.WriteLine("INPUT INFO \n ID : {0} \n ", IdText.Text
            //    + "\n attend start : " + workStartT1.Text + " attend end : " + workStartT2.Text
            //    + "\n leave start : " + offWorkT1.Text + " leave end : " + offWorkT2.Text);

            Log_Info("INPUT INFO | ID : " + IdText.Text
                + " | attend start : " + workStartT1.Text + " | attend end : " + workStartT2.Text
                + " | leave start : " + offWorkT1.Text + " | leave end : " + offWorkT2.Text);


            Properties.Settings.Default.userIdSetValue = IdText.Text;
            Properties.Settings.Default.workStartT1SetValue = workStartT1.Text;
            Properties.Settings.Default.workStartT2SetValue = workStartT2.Text;
            Properties.Settings.Default.offWorkT1SetValue = offWorkT1.Text;
            Properties.Settings.Default.offWorkT2SetValue = offWorkT2.Text;
            Properties.Settings.Default.onOffTimesettingSetValue = onOffTimesetting.Text;

            Properties.Settings.Default.Save();

        }



        private void RemovePlaceholder(object sender, EventArgs e)
        {
            // C# placeholder 참조사이트
            //https://ella-devblog.tistory.com/70

            TextBox txt = (TextBox)sender;
            if (txt.Text == IdPlaceholder | txt.Text == PwPlaceholder)
            { //텍스트박스 내용이 사용자가 입력한 값이 아닌 Placeholder일 경우에만, 커서 포커스일때 빈칸으로 만들기
                txt.ForeColor = Color.Black; //사용자 입력 진한 글씨
                txt.Text = string.Empty;
                if (txt == PassText) PassText.PasswordChar = '●';
            }
        }

        private void SetPlaceholder(object sender, EventArgs e)
        {
            // C# placeholder 참조사이트
            //https://ella-devblog.tistory.com/70

            TextBox txt = (TextBox)sender;
            if (string.IsNullOrWhiteSpace(txt.Text))
            {
                //사용자 입력값이 하나도 없는 경우에 포커스 잃으면 Placeholder 적용해주기
                txt.ForeColor = Color.DarkGray; //Placeholder 흐린 글씨
                if (txt == IdText) 
                    txt.Text = IdPlaceholder;
                else if (txt == PassText) 
                { 
                    txt.Text = PwPlaceholder; 
                    PassText.PasswordChar = default; 
                }
            }
        }


        private void login_button_Clicked(object sender, EventArgs e)
        {
            if (!isInfoReady())
            {
                return;
            }

            Log_Info("로그인 시작");

            string id = IdText.Text;
            string pw = PassText.Text;

            firstInit();

            int size = chromeList.Count;

            var _driver = chromeList[size - 1];

            if ( _driver == null)
            {
                Log_Info("web List의 마지막에서 가져온 driver의 객체가 비었음.");
                return;
            }

            var inputID = _driver.FindElementByXPath("X-PATH");
            inputID.SendKeys( id );

            var InputPW = _driver.FindElementByXPath("X-PATH");
            InputPW.SendKeys( pw );

            var LoginButton = _driver.FindElementByXPath("X-PATH");
            LoginButton.Click();
        }

        private void login_after_Clicked(object sender, EventArgs e)
        {
            if (!isInfoReady())
            {
                return;
            }

            Log_Info("로그인후 근태탭으로 이동");
            login_button_Clicked(sender, e);

            int size = chromeList.Count;

            var _driver = chromeList[size - 1];

            if (_driver == null)
            {
                Log_Info("web List의 마지막에서 가져온 driver의 객체가 비었음.");
                return;
            }

            var goToAttend = _driver.FindElementById("DIV_ID");

            goToAttend.Click();


            var closeAlram = _driver.FindElementByXPath("X-PATH");

            if(closeAlram != null)
            {
                closeAlram.Click();
            }




        }


        private void work_button_Click(object sender, EventArgs e)
        {
            if (!isInfoReady())
            {
                return;
            }


            DateTime nowDt = DateTime.Now;

            if (nowDt.DayOfWeek == DayOfWeek.Saturday)
            {
                MessageBox.Show("오늘은 토요일. 회사 안옴 스킵. 수고.");
                Log_Info("오늘은 토요일. 회사 안옴 스킵. 수고.");
                return;
            }
            else if (nowDt.DayOfWeek == DayOfWeek.Sunday)
            {
                MessageBox.Show("오늘은 일요일. 회사 안옴 스킵. 수고.");
                Log_Info("오늘은 일요일. 회사 안옴 스킵. 수고.");
                return;
            }

            Log_Info("로그인후 출근버튼 클릭하기");
            login_after_Clicked(sender, e);

            Thread.Sleep(1000);

            int size = chromeList.Count;

            var _driver = chromeList[size - 1];

            if (_driver == null)
            {
                Log_Info("web List의 마지막에서 가져온 driver의 객체가 비었음.");
                return;
            }

            try
            {
                var attendButton = _driver.FindElementByXPath("X-PATH");
            attendButton.Click();
            }
            catch (Exception error)
            {
                Log_Info("출근 버튼을 눌렀을때 오류 | Error log : " + error.Message );
                return;
            }

            /*
            try
            {
                var attendButtonClass = _driver.FindElementByCssSelector("CSS_ID");
                attendButtonClass.Click();
            }
            catch (Exception error)
            {
                Log_Info("출근 버튼을 눌렀을때 오류 | Error log : " + error.Message );
                return;
            }
            */

            var popupButton = _driver.FindElementByXPath("X-PATH");
            popupButton.Click();

            Thread.Sleep(1000);

            this.Work = true;

            closeAllChrome();

        }

        private void off_work_button_Click(object sender, EventArgs e)
        {
            if (!isInfoReady())
            {
                return;
            }


            //MessageBox.Show("button5_Click");
            DateTime nowDt = DateTime.Now;

            if (nowDt.DayOfWeek == DayOfWeek.Saturday)
            {
                MessageBox.Show("오늘은 토요일. 회사 안옴 스킵. 수고.");
                Log_Info("오늘은 토요일. 회사 안옴 스킵. 수고.");
                return;
            }
            else if (nowDt.DayOfWeek == DayOfWeek.Sunday)
            {
                MessageBox.Show("오늘은 일요일. 회사 안옴 스킵. 수고.");
                Log_Info("오늘은 일요일. 회사 안옴 스킵. 수고.");
                return;
            }


            Log_Info("로그인후 퇴근버튼 클릭하기");
            login_after_Clicked(sender, e);

            int size = chromeList.Count;

            var _driver = chromeList[size - 1];

            if (_driver == null)
            {
                Log_Info("web List의 마지막에서 가져온 driver의 객체가 비었음.");
                return;
            }

            try
            {
                var attendButton = _driver.FindElementByXPath("X-PATH");
                attendButton.Click();
            }
            catch (Exception error)
            {
                Log_Info("퇴근 버튼을 눌렀을때 생기는 오류 | Error log : " + error.Message);
                return;
            }

            var popupButton = _driver.FindElementByXPath("X-PATH");
            popupButton.Click();

            Thread.Sleep(1000);

            this.offWork = true;

            closeAllChrome();

        }

        private void AutoAttendanceStopButton_Click(object sender, EventArgs e)
        {
            this.AutoAttendanceStartButton.UseVisualStyleBackColor = true;
            AutoAttendanceStartButton.Text = "자동 출퇴근 시작버튼";

            settingStartWorkTime.Text = "--";
            settingEndWorkTime.Text = "--";

            attendenceLabelText.Text = "--";
            offWorkLabelText.Text = "--";

            isAutoRunning.Text = "실행중지됨";

            this.While = false;
        }

        private void autoAttendance_button_Click(object sender, EventArgs e)
        {
            if(!isInfoReady())
            {
                return;
            }


            AutoAttendanceStartButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128)))));
            AutoAttendanceStartButton.Text = "자동 출퇴근 실행중";

            // 시작시간 범위 갖고와서 시간객체로변환
            // 자정 또는 프로그램이 켜진 시점에서
            // 랜덤으로 출근시간, 퇴근시간을 뽑음
            // 뽑힌 출퇴근 시간과 시간객체로 변환된
            // 시간 범위내라면 해당 시간에 버튼을 클릭하게함.

            // 매 자정마다 초기화같은걸 생각해서
            // 출퇴근 시간 세팅을 메소드로 따로 빼서
            // 모듈화
            Log_Info("자동 출퇴근 버튼 클릭");

            isAutoRunning.Text = "실행중";

            this.startRandomTime = setStartWorkTime();

            this.endRandomTime = setEndWorkTime();

            this.While = true;

            // int to date 참조사이트
            //https://codewithshadman.com/csharp-number-and-datetime-tips/

            this.sender = sender;
            this.e = e;


            // 이부분 스레드로 돌리면 될듯
            //------------------------------------------------------------
            // 인자값 넘기는것 때문에 스레드로 돌리는건 따로 더 찾아봐야할듯.
            Thread thr = new Thread(new ThreadStart(tryAttendanceWhile) );
            Thread thr2 = new Thread(new ThreadStart(initTime));
            thr.Start();
            thr2.Start();
            //------------------------------------------------------------


        }

몇번 적고나니 생각해보게 된 건데

 

티스토리에서 소스코드형식을 지원하지만

내부 변수및 메소드명에 대한 구분을 위한 색 보정은 없는것같다.

 

알아서 잘 봐야할 것 같다.

 

C#을 하면서 놀라면서도 편했던게 var라는 임시 변수와

메소드를 인자값으로 넘겨줄 수 있는 대리자라는게 존재했었다는것 이다.

 

그동안 자바에서는 꼭 객체 타입을 맞게 새로운 객체를 가져다 썼어야 했고

 

같은 객체나 클래스내에 있는 메소드가 아니지만 굳이 한번은 써야할때,

새로 쓰려면 객체 생성해야하고,

생성자의 인자값이 필요하다면 인자값을 다 일일이 입력해주고 나서야

메소드를 사용할 수 있었는데, 너무나도 간편하게 사용할 수 있어서 놀랐다.

물론 간편한만큼 추상적이고, 추상적인만큼 사용할때 조심해야 하지만

커다란 프로젝트도 아니고 간단하게 만든 토이 프로젝트인만큼

새로운걸 경험해보자는 목적은 달성할 수 있었다.

 

 

가독성을 위해서 그림과 소스에 대한 자세한 설명은 다음글에서 할 수 있도록 할 예정이다.

 

정말 새삼스럽게 느낀거지만

글을 읽을 수 있어 글로만 적는 것과

적는사람이 정말 힘들고 복잡하지만 소스와 그림을 보며 적어놓은 것에 대한 가독성의 차이는 상상을 초월하더라

이를 느꼈기때문에 바쁘지 않다면 귀차니즘을 이겨내고 적을수 있도록 할 예정이다.

 

728x90

댓글