목차
소개
AWS를 사용하여 서버리스 애플리케이션을 개발했지만 최신 방식으로 뉴토끼 167를하고 싶었으므로 UI 뉴토끼 167를 자동화하기로 결정했습니다
나는 뉴토끼 167 코드를 구현 한 경험이 있기 때문에 Java와 Selenium을 사용하기로 결정했습니다 AWS를 사용하고 있기 때문에 Code Brothers (CodeCommit, CodeBuild, CodePipeline)를 사용하여 자동화하기로 결정했습니다 Selenium과 Code Brothers는 모두 그것들을 사용한 경험을 가지고 있기 때문에 이것은 내가 처음으로 그것들을 결합하여 사용했지만, 나는 많은 문제가있을 것이라고 생각하지 않습니다! 내가 생각했던 것처럼, 나는 내가 예상했던 것보다 더 많이 걸렸다
이번에는 뉴토끼 167 설정을 간단히 소개하고 내가 직면 한 문제와 솔루션을 요약하고 싶습니다
UI 뉴토끼 167 자동화 구성
현재 뉴토끼 167 자동화 섹션의 구조를 요약하려면 아래 이미지는 다이어그램에 표시됩니다
응용 프로그램의 프론트 엔드 부분은 S3 버킷으로 호스팅 된 정적 웹 사이트이며 게시 된 컨텐츠에 대한 뉴토끼 167 코드를 실행합니다
실행중인 뉴토끼 167 코드의 흐름은 대략 다음과 같습니다
- 사용자는 뉴토끼 167 코드를 구현하고 CodeCommit 저장소로 푸시
- 푸시로 트리거되고 CodePipeline이 뉴토끼 167
- 복제 뉴토끼 167 커밋 저장소
- CodeBuild 및 실행 뉴토끼 167로 뉴토끼 167 코드를 컴파일
뉴토끼 167 코드 구현
Selenium에 대해 말하면, 나는 Eclipse를 사용하여 상당히 많은 볼륨 뉴토끼 167 프로젝트를 구현했지만 이번에는 그것이 무언가로 작동하는지 확인하고 싶습니다! 나는 그렇게 생각했다,AWS 공식 문서
Maven Project 만들기
먼저 작업 디렉토리에서 다음 명령을 뉴토끼 167하여 Maven 프로젝트를 만듭니다 Maven은 미리 설치해야합니다 내가 설치 한 Maven은 버전 363입니다
1 |
MVNArchetype:생성 -dgroupid=[임의 그룹id] -dartifactid=[임의의 유물id] -darchetypeartifactid=Maven-Archetype-QuickStart -DinteractiveMode=거짓 |
지정 해야하는 두 매개 변수는 다음과 같습니다 좋아하는 이름을 지정하는 것이 좋습니다
- 임의 그룹 ID : 패키지 이름 도트 연결은 계층 구조를 만듭니다 (예 : commycompanyapp)
- 임의의 인공물 ID : 프로젝트 이름
buildspecyml 만들기
빌드 사양을 정의하는 buildspecyml을 작성하십시오 요컨대, CodeBuild가 수행하려는 조치를 정의합니다 이 경우 프로세스에는 뉴토끼 167 코드를 컴파일하고 컴파일 된 뉴토끼 167 코드를 실행하는 것이 포함됩니다
다음 내용이있는 생성 된 Maven 프로젝트의 루트 디렉토리 바로 아래에서 buildspecyml 생성 :
1 2 3 4 5 6 7 8 9 10 |
버전: 0.2 단계: 설치: 런타임 버전: Java: Corretto11 build: 명령: - echo build 시작 on `날짜` - MVN 뉴토끼 167 |
이번에는 Java11을 사용하고 싶었으므로 "Corretto11"을 지정했지만 Java8의 경우 "Corretto8"을 지정하십시오 Maven을 사용하면 "MVN 뉴토끼 167"는 뉴토끼 167 코드를 컴파일하고 실행합니다
뉴토끼 167 코드 구현
Maven 프로젝트의 뉴토끼 167 패키지에 저장된 파일 apptestjava에 다음 뉴토끼 167 방법을 추가하십시오
이번에는 먼저 작동하는지 확인하고 싶습니다 그래서 브라우저에서 Google을 열고 "Chromedriver"를 검색하는 뉴토끼 167 코드를 작성하고 싶습니다
1 2 3 4 5 6 7 8 9 10 11 12 |
public void TestGoogleSearch() 던지기 InterruptedException 시스템.SetProperty("webdriver뉴토끼 167", "[뉴토끼 167 Path]"); Final WebDriver드라이버 = NEW 뉴토끼 167(); 드라이버.get("http://wwwgooglecom"); 스레드.수면(5000); Final WebElementSearchBox = 드라이버.FindElement(by.이름("Q")); SearchBox.Sendkeys("뉴토끼 167"); SearchBox.제출(); 스레드.수면(5000); 드라이버.종료(); |
CodePipeline 구성
이번에는 자세히 설명하지 않지만 구성 다이어그램에 표시된대로 CodePipeline을 설정합니다 거친 절차는 다음과 같습니다
- CodeCommit으로 리포지토리 생성
- CodePipeline 만들기
- 소스 제공 업체에서 생성 한 CodeCommit 저장소를 선택하십시오
- 빌드 스테이지를 추가하여 새 뉴토끼 167 빌드 프로젝트 생성
(BuildSpec 설정에서 생성 된 buildspecyml을 지정)
CodePipeline을 만들기 전에 뉴토끼 167 빌드 프로젝트를 만듭니다 나는 항상 CodePipeline을 만드는 과정에서 빌드 프로젝트를 만듭니다
뉴토끼 167를 리포지토리에 커밋하는 경우 BuildSpecyml을 실행하는 트리거로 사용하십시오
뉴토끼 167 + Selenium과 관련된 문제 및 솔루션
소개가 꽤 길어졌지만이 기사의 주요 주제는 다음과 같습니다! CodePipeline이 제대로 작동한다고 가정하면 CodeBuild를 뉴토끼 167할 때 발생하는 문제와 실제로 수행 한 솔루션을 소개합니다
1 부 : Chrome/뉴토끼 167가 필요합니까?
나는 얼마 전에 Jenkins + Ant로 뉴토끼 167 자동화를 시도했으며 Jenkins 서버에 Chrome 및 Chromedriver를 설치 한 것을 기억합니다 그래서 이번에는 직접 설치해야한다고 생각했습니다
하지만! 뉴토끼 167에서 선택할 수있는 환경 (Docker Image, Ubuntu 또는 Amazon Linux 2)에는 기본적으로 Chrome 및 Chromedriver가 포함되어 있습니다 나는 이것을 깨달을 때까지 직접 설치하기 위해 열심히 노력했습니다 너무 쉽습니다!
그건 그렇고, 뉴토끼 167에서 선택할 수있는 도커 이미지는여기 (Github)에 게시 Dockerfile의 내용을 살펴보면 Chrome 및 뉴토끼 167뿐만 아니라 기본적으로 설치된 내용을 볼 수 있습니다
기본적으로 최신 버전에 가까운 Chrome 및 뉴토끼 167가 설치되고 암호도 전달되므로 이전 버전을 사용하지 않으면 직접 설치할 필요가 없습니다 경로는 Dockerfile에도 나열되어 있지만 다음 표는 일반적으로 선택되는 두 개의 Docker 이미지의 경로를 요약합니다
Chrome Pass | 뉴토끼 167 Pass | |
우분투 표준 : 40 | /opt/Google/Chrome/Google-Chrome | /usr/bin/뉴토끼 167 |
Amazon Linux 2 x86_64 표준 : 30 | /usr/bin/chromium-browser | /usr/bin/뉴토끼 167 |
뉴토끼 167 코드에서 Chromedriver를 지정할 때 아래 예제에 표시된대로 위 경로를 지정하십시오
1 |
System.SetProperty("webdriver뉴토끼 167", "/usr/bin/뉴토끼 167"); |
2 부 : CodeBuild 환경에서 뉴토끼 167 할 URL에 액세스 할 수 없습니다
뉴토끼 167 할 URL에 액세스하려면 CodeBuild 환경에서 인터넷에 연결할 수 있어야합니다 CodeBuild에서 S3에 액세스하는 것은 인터넷을 통해 수단입니다
빌드 프로젝트 환경 설정에 VPC 설정이 있으므로 Route 테이블에 NAT 게이트웨이가있는 서브넷을 지정하여 해결할 수 있습니다 (자세한 설정은 생략됩니다)
아래 예에서는 두 개의 서브넷이 지정되어 있지만 중복되지 않는 한 하나는 괜찮습니다
"VPC 설정 확인"버튼을 클릭하여 인터넷에 연결되어 있는지 확인하십시오 그린 확인 마크가 아래와 같이 나타나면 연결이 성공적입니다
3 부 : 뉴토끼 167가 시작될 수 없습니다
Chrome 및 Chromedriver가 설치되어 인터넷에 연결할 수 있지만 뉴토끼 167가 작동하지 않으므로 Chromedriver가 실행되지 않을 것입니다 ? 이 의심은 나타났습니다 ChromedRiver 명령을 buildspecyml에 추가하여 시작하도록 강제로 시도했으며 다음 메시지가 표시되었습니다
1 2 3 4 5 6 |
뉴토끼 167 --Verbose 시작뉴토끼 167 80.0.3987.106 (xxxxxxxxx-Refs/Branch-헤드/xxxxxx) on포트 9515 전용Local연결are허용. 제발보호포트중고by뉴토끼 167and 관련뉴토끼 167프레임 워크to 예방Accessby악의적뉴토끼 167. [xxxxxxx.xxx][심한]: bind() 실패: 할 수 없음할당요청주소 (99) [xxxxxx.xxx][정보]: 듣기onIPv6실패with오류err_address_invalid |
뉴토끼 167 환경이 IPv6을 지원하지 않더라도 Chromedriver는 IPv6 주소에서 듣기를 시도하고 실패합니다
솔루션은 뉴토끼 167 환경에서 IPv6을 지원하거나 IPv4 주소가있는 Chromedriver를 듣는 것입니다 그러나 전자는 즉시 불가능한 것처럼 보이므로 후자를 해결하고 싶습니다 연구를 한 후 Chromedriver 스타트 업 옵션은 "-whitelisted-IPS"를 지정하는 것이 좋습니다 (머리에는 두 개의 하이픈이 있습니다) 이를 지정하면 IPv4 주소를 듣는 것 같습니다
Chromeoptions 객체에서 다음과 같이 옵션을 지정해보십시오
1 2 3 |
Chromeoptions옵션 = NEW Chromeoptions(); 옵션.addarguments("-화이트리스트-IPS ="); 드라이버 = NEW 뉴토끼 167(옵션); |
주소를 좁히려면 쉼표로 구분 된 IPv4 주소를 지정할 수있는 것 같습니다
이것은 해결합니다! 그렇게 생각한다면?
– whitelisted-IPS 옵션이 작동하지 않습니다
예, whitelisted-IPS를 지정하더라도 오류가 변경되지 않았습니다 분명히 옵션은 제대로 적용되지 않습니다 왜
크롬 외 이외의 옵션을 지정하는 방법이 있습니까? 이 작업을 수행 한 후 시스템 속성에 지정할 수있는 방법이있는 것으로 보입니다 크롬 옵션 대신 시스템 속성으로 옵션을 지정하면 다음과 같이 옵션이 성공적으로 적용되었습니다! 행복하다
1 |
System.SetProperty("webdriverchromewhitelistedips", ""); |
4 부 : 뉴토끼 167를 실행할 때마다 Chromedriver 포트 변경
MVN 뉴토끼 167 명령을 실행하면 뉴토끼 167 코드가 실행되고 ChromedRiver가 해당 뉴토끼 167 코드 내부에서 시작됩니다 로그를 살펴보면 Chromedriver가 사용하는 포트가 시작될 때마다 변경되는 것을 알았습니다
1 2 3 4 5 6 7 8 |
[info] ------------------------------------------------------- [info]T e S T S [Info] ------------------------------------------------------- [정보] RunningUITEST.apptest 시작뉴토끼 167 80.0.3987.106 (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-Refs/Branch-헤드/xxxxxx) on포트 1024 전용Local연결are허용. 제발보호포트중고by뉴토끼 167and 관련뉴토끼 167프레임 워크to 예방Accessby악의적뉴토끼 167. [xxxxxxx.xxx][심한]: bind() 실패: 할 수 없음할당요청주소 (99) |
위의 예에서 포트 1024는이지만 매번 변경됩니다
이것을 로그와 비교하십시오 "파트 3 : 뉴토끼 167는 시작할 수 없습니다"명령으로 뉴토끼 167를 시작할 때 포트 9515가 사용됩니다 뉴토끼 167가 일반적으로 사용하는 포트는 기본적으로 9515로 보입니다
그래서 뉴토끼 167 코드에서 포트 9515에서 Chromedriver를 시작해야한다고 생각합니다! 따라서 Chromedriver 주변의 구현을 다음과 같이 변경하겠습니다
1 2 3 4 5 6 |
최종 Chromeoptions옵션 = NEW Chromeoptions(); 옵션.addarguments(chrome_options); Final 뉴토끼 167service서비스 = NEW 뉴토끼 167service.Builder().사용(9515).build(); 드라이버 = NEW 뉴토끼 167(서비스, 옵션); |
Chrome_options는 뉴토끼 167 스타트 업 옵션을 한 번에 정의하는 배열입니다 이제 그들은 항상 포트 9515를 사용합니다
결론
이번에 내가 쓴 내용을 되돌아 보면 셀레늄 자체가 아닌 Chromedriver의 문제라고 생각했습니다 셀레늄을 사용하여 뉴토끼 167를 구현 한 것은 이번이 처음이 아니며 Jenkins와 유사한 자동화를 구축했지만 운영 환경이 다르면 그렇게 어려움을 겪고 있습니다
이번에 도입 된 "1 부"에 "Part 4"에 응답하여 뉴토끼 167를 성공적으로 실행할 수있었습니다 같은 것에 대한 우려가 있다면 이것이 도움이되기를 바랍니다
저자 프로필

- TDI 디지털 혁신 기술 부서
- 내부 개발 프로젝트에 대한 기술 지원 및 새로운 기술 검증 그는 주로 응용 프로그램 개발 지원을 담당하며 Java 및 Server 측에서 능숙합니다 최근에, 우리는 서버리스 onaws를 홍보하고 있습니다
이 저자의 최신 기사
IT 열2025 년 2 월 13 일최근 날짜 및 시간 형식 처리 (Java Edition)를 살펴 보았습니다
픽업!2024 년 5 월 23 일Visual Studio Code 원격 개발을 사용하여 EC2에 대한 SSH 연결 - 프록시를 넘어서
픽업!2022 년 5 월 23 일브라우저의 뒤/새로 고침 버튼을 누를 수 있는지 여부와 자체 대화 상자를 표시 할 수 있는지 여부를 확인했습니다
픽업!2021 년 12 월 23 일나는 AWS CodeCommit 뉴토끼 325 규칙 워크 플로우를 사용해 보았다