웹 자동화 테스트 도구인 Selenium 사용

셀렌

개요

Selenium은 브라우저 작업을 자동화하기 위한 오픈 소스 프레임워크입니다. 웹 애플리케이션의 기능과 사용자 인터페이스를 테스트하기 위한 도구 및 라이브러리 세트를 제공합니다.

Selenium을 사용하면 브라우저에서 클릭, 양식 작성, 드롭다운 상자 선택 등과 같은 사용자 상호 작용을 시뮬레이션하는 스크립트를 작성할 수 있습니다. 이러한 스크립트는 자동으로 실행되어 애플리케이션이 예상대로 작동하는지 확인할 수 있습니다.

Selenium은 Java, Python, C# 등을 포함한 다양한 프로그래밍 언어를 지원하므로 개발자는 익숙한 언어로 테스트 스크립트를 작성하고 실행할 수 있습니다.

또한 Selenium에는 브라우저와 직접 상호 작용하기 위한 Selenium WebDriver, 여러 브라우저 및 플랫폼에서 병렬로 테스트를 실행하기 위한 Selenium Grid를 비롯한 다양한 도구와 구성 요소가 있으며, 탐색 검색, 상호 작용 및 페이지 요소에 대한 어설션을 처리하기 위한 풍부한 API 및 기능을 제공합니다.

공식 웹 사이트:https://www.selenium.dev/

공식 웹사이트 문서:https://www.selenium.dev/documentation/

중국어 문서:https://python-selenium-zh.readthedocs.io/zh_CN/latest/

여기에 이미지 설명을 삽입하세요.

작동 원리

브라우저의 기본 API를 활용하여 객체지향 Selenium WebDriver API로 캡슐화합니다.(브라우저의 다양한 기능을 캡슐화합니다.) 프로그램 스크립트는 Selenium API를 통해 브라우저(Google 및 Microsoft)를 제어하거나 브라우저 페이지 요소를 작동하거나 브라우저 자체 (스크린샷, 창 크기, 시작, 종료)

응용 시나리오

자동화된 테스트:

Selenium은 가장 일반적으로 사용되는 자동화 테스트 도구 중 하나입니다. 실제 사용자의 상호 작용 동작을 시뮬레이션하고 기능 테스트, 회귀 테스트, 성능 테스트를 포함한 다양한 테스트 사례를 자동으로 실행할 수 있습니다. Selenium을 사용하면 웹 애플리케이션의 다양한 기능을 자동으로 테스트하고, 사용자 인터페이스의 정확성을 확인하고, 문제를 포착하고 보고할 수 있습니다.

호환성 테스트:

Selenium을 사용하면 자동화된 테스트 스크립트를 다양한 브라우저 및 운영 체제에서 실행하여 다양한 환경에서 웹 애플리케이션의 호환성을 확인할 수 있습니다. 이렇게 하면 애플리케이션이 브라우저와 플랫폼 전반에서 일관되게 실행됩니다.

데이터 스크랩 및 웹 요약:

Selenium을 사용하면 웹 콘텐츠를 크롤링하여 필요한 데이터를 얻을 수 있습니다. 스크립트를 작성하면 사용자가 브라우저를 작동하고, 웹 페이지에 액세스하고, 가격 비교, 뉴스 요약 등과 같은 데이터를 추출하는 것을 시뮬레이션할 수 있습니다.

자동 양식 작성:

많은 양의 양식 데이터를 채워야 하는 경우 수동으로 작성하면 많은 시간과 노력이 소모될 수 있습니다. Selenium을 사용하면 양식을 자동으로 채우고 효율성을 향상시키는 스크립트를 작성할 수 있습니다.

UI 자동화 테스트:

Selenium은 사용자 인터페이스의 정확성과 일관성을 확인할 수 있습니다. 사용자 상호 작용 및 작업을 시뮬레이션함으로써 사용자 인터페이스의 다양한 시나리오를 자동으로 테스트하여 정확성과 기능성을 보장할 수 있습니다.

프런트엔드 개발 및 디버깅:

개발자는 Selenium을 사용하여 프런트 엔드 코드를 디버깅하고 확인할 수 있습니다. 자동화된 테스트 스크립트를 사용하면 사용자 작업을 시뮬레이션하고 페이지의 렌더링 및 기능이 제대로 작동하는지 확인할 수 있습니다.

브라우저 드라이버 설치

브라우저 드라이버를 설치하려면 Chrome 브라우저를 예로 들어 보겠습니다.

알아채다:必须下载对应的 chrome 版本对应的驱动

크롬 드라이버:https://sites.google.com/chromium.org/driver/

크롬 드라이버(이전):https://sites.google.com/a/chromium.org/chromedriver/

국내 타오바오 거울:http://npm.taobao.org/mirrors/chromedriver/

1. Chrome 버전 확인

다음과 같이 Chrome 버전을 확인합니다. 110.0.5481.100
여기에 이미지 설명을 삽입하세요.
2. ChromeDriver 버전을 확인합니다.

1. Chrome 버전 번호를 확인하고 마지막 부분을 삭제한 후 110.0.5481.

2. 결과를 https://chromedriver.storage.googleapis.com/LATEST_RELEASE_뒷면에 접합합니다.

3. URL: 을 얻고 https://chromedriver.storage.googleapis.com/LATEST_RELEASE_110.0.5481링크에 액세스하여 ChromeDriver 버전 번호를 얻습니다.

여기에 이미지 설명을 삽입하세요.
3. ChromeDriver 다운로드

해당 버전의 크롬드라이버를 찾아 다운로드 하시면 됩니다 최신 크롬 브라우저이므로 홈페이지에서 한번에 찾아보실 수 있습니다.

여기에 이미지 설명을 삽입하세요.
운영 체제에 따라 다른 ChromeDriver를 다운로드합니다.
여기에 이미지 설명을 삽입하세요.
3. 환경 변수 구성(선택 사항)

압축된 패키지의 압축을 풀면 실행 파일이 제공되며 chromedriver.exe, Python 코드를 직접 호출할 수 있습니다.

경로 환경 변수에 chromedriver.exe 해당 디렉토리를 추가하십시오.

기본 사용

셀레늄 모듈 설치

pip install selenium

주의점

버전 반복으로 인해 새 버전의 Selenium에서는 더 이상 find_element_by_id메서드를 사용하지 않고 를 사용합니다 find_element(By.ID, ''). 자세한 내용은 Selenium 버전을 참조하세요.

버전 반복으로 인해 예외가 발생할 수 있습니다.AttributeError: 'WebDriver' object has no attribute 'find_element_by_id'

from selenium import webdriver
from selenium.webdriver.common.by import By

# 老版本
input_element = browser.find_element_by_id("kw")

# 新版本
input_element = browser.find_element(By.ID, 'kw')

분석 사용

Baidu를 사용하면 자동으로 키워드를 검색 selenium하고 자동으로 클릭하여 검색 결과로 이동할 수 있습니다.

입력 상자 요소 가져오기 및 검색 버튼 요소 정보 가져오기

여기에 이미지 설명을 삽입하세요.
첫 번째 검색 결과의 주소 정보를 가져옵니다.
여기에 이미지 설명을 삽입하세요.

암호

# 导入模块
import time

from selenium import webdriver
from selenium.webdriver.common.by import By

# 创建浏览器对象,需指定驱动。驱动有2种方式获取
# 1.通过手动指定浏览器驱动路径
browser = webdriver.Chrome('D:\Development\chromedriver_win32\chromedriver.exe')
# 2.通过$PATH环境变量寻找驱动,如果寻找不到就报错
# browser = webdriver.Chrome()

# 指定操作浏览器对象的行为
# 让浏览器访问网页
browser.get("https://www.baidu.com/")
# 获取输入框元素
# input_element = browser.find_element_by_id("kw")
input_element = browser.find_element(By.ID, 'kw')
# 输入内容
input_element.send_keys('selenium')
# 获取搜索按钮
button_element = browser.find_element(By.ID, 'su')
# 点击搜索
button_element.click()

time.sleep(3)

# 获取地址
url_element = browser.find_element(By.CLASS_NAME, "c-gap-bottom-small").find_element(By.TAG_NAME, 'a')
url_element.click()

time.sleep(5)

# 退出浏览器
browser.quit()

일반적인 방법

드라이버 객체

셀레늄을 사용하는 과정에서 드라이버 개체를 인스턴스화한 후 드라이버 개체에는 일반적으로 사용되는 몇 가지 속성과 메서드가 있습니다.

driver.page_source 当前标签页浏览器渲染之后的网页源代码
driver.current_url 当前标签页的url
driver.close() 关闭当前标签页,如果只有一个标签页则关闭整个浏览器
driver.quit() 关闭浏览器
driver.forward() 页面前进
driver.back() 页面后退
driver.screen_shot(img_name) 页面截图

라벨 요소 찾기 및 라벨 객체 획득

셀레늄에서 태그를 찾고 태그 요소 객체를 반환하는 방법에는 여러 가지가 있습니다.

구 버전

find_element_by_xxx 返回第一个符合条件

find_elements_by_xxx 返回符合条件所有元素的WebEelemnt列表

find_element匹配不到就抛出异常,find_elements匹配不到就返回空列表
find_element_by_id 通过ID
find_element_by_class_name 通过class查询元素
find_element_by_name 通过name
find_element_by_tag_name 通过标签名称
find_element_by_css_selector css样式选择
find_element_by_link_text 通过链接内容查找
find_element_by_partial_link_text 通过链接内容包含的内容查找,模糊查询
find_element_by_xpath 通过xpath查找数据

새로운 버전

find_element(BY, 'str')

find_elements(BY, 'str')
find_element(By.ID, 'id')
find_element(By.CLASS_NAME, 'calss_name')
find_element(By.NAME, 'name')
find_element(By.TAG_NAME, 'tag_name')
find_element(By.CSS_SELECTOR, 'css_selector')
find_element(By.LINK_TEXT, 'link_text')
find_element(By.PARTIAL_LINK_TEXT, 'partial_link_text')
find_element(By.XPATH, 'xpath')

텍스트 내용 및 속성 값 가져오기

요소 속성 값 가져오기

element.get_attribute('属性名')

요소 텍스트 콘텐츠 가져오기

element.text

입력창에 데이터를 입력하세요

input_element.send_keys('selenium')

요소 클릭 수행

button_element.click()

헤드리스 브라우저 사용

대부분의 서버에는 인터페이스가 없습니다. Selenium은 Google Chrome을 헤드리스 모드로 제어합니다. 인터페이스 없는 모드를 헤드리스 모드라고도 합니다.

pyantomjs 드라이버 사용

pyantomjs 드라이버를 사용하는 것은 권장되지 않습니다. pyantomjs 메서드는 Selenium에 의해 제거되었습니다.

다운로드 링크:http://phantomjs.org/download.html

용법

# 导入模块
import time

from selenium import webdriver

# 创建浏览器对象
browser = webdriver.PhantomJS(executable_path=r"D:\Development\phantomjs-2.1.1-windows\bin\phantomjs.exe")

# 指定操作浏览器对象的行为
# 让浏览器访问网页
browser.get("https://www.baidu.com/")
# 保存截图调试
browser.save_screenshot('screenshot.png')

예외 1:

새 버전의 Selenium은 PhantomJS를 포기했으므로 AttributeError: module 'selenium.webdriver' has no attribute 'PhantomJS'예외가 발생합니다.

셀레늄 제거

pip uninstall selenium

지정된 버전의 셀레늄 설치

pip install selenium==3.14.0

예외 2:

selenium.common.exceptions.WebDriverException: Message: 'phantomjs.exe' executable needs to be in PATH. 

해결 방법 1: 전체 경로 앞에 r을 추가합니다.

browser = webdriver.PhantomJS(executable_path=r"D:\Development\phantomjs-2.1.1-windows\bin\phantomjs.exe")

해결 방법 2: 시스템 변수에 bin 파일 경로를 추가합니다.

C:\Users\Admin>phantomjs -v
2.1.1

Chrome 시작 매개변수 설정

# 导入模块
from selenium import webdriver

# 创建浏览器对象,指定配置参数
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 开启无界面模式
options.add_argument('--disable-gpu')  # 禁用gpu
# 实例化带有配置对象的driver对象
browser = webdriver.Chrome('D:\Development\chromedriver_win32\chromedriver.exe', chrome_options=options)

# 指定操作浏览器对象的行为
# 让浏览器访问网页
browser.get("https://www.baidu.com/")
# 保存截图调试
browser.save_screenshot('screenshot.png')

기타 작업

창 전환

브라우저는 여러 웹 페이지를 열 수 있으며 현재 얻은 웹 페이지 요소가 어떤 형식인지 찾아야 합니다. browser.switch_to.window를 통해 창 전환

# 获取当前所有的窗口
print(browser.window_handles)

# 获取当前选中窗体的名称
print(browser.current_window_handle)

print("切换前:", browser.title)

# 执行js新开一个标签页
js = 'window.open("https://www.baidu.com");'
browser.execute_script(js)
time.sleep(3)

# 获取当前所有的窗口
print(browser.window_handles)

# 切换窗体
browser.switch_to.window(browser.window_handles[1])
print("切换后:", browser.title)

ifrme 스위치

iframe은 HTML에서 일반적으로 사용되는 기술입니다. 즉, 한 페이지가 다른 웹 페이지 내에 중첩됩니다.

브라우저 웹페이지에는 iframe 웹페이지가 포함될 수 있습니다. Selenium은 기본적으로 프레임의 콘텐츠에 액세스할 수 없으므로 iframe 웹페이지 요소를 가져와야 합니다. browser.switch_to.frame을 통해 iframe 전환

import time

# 导入模块
from selenium import webdriver

# 创建浏览器对象
# 参数驱动路径
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()

browser.get("https://mail.qq.com/cgi-bin/loginpage")
print("切换前:", browser.page_source)

# 获取iframe元素对象
iframe_element = browser.find_element(By.ID, 'login_frame')
# 切换 iframe
browser.switch_to.frame(iframe_element)
print("切换后:", browser.page_source)

# 切换回 主窗口
browser.switch_to.default_content()
print("切回后:", browser.page_source)

# 利用切换标签页的方式切出frame标签
# windows = driver.window_handles
# driver.switch_to.window(windows[0])
time.sleep(5)

# 退出浏览器
browser.quit()

사용자 에이전트 및 프록시 설정

Selenium이 Google Chrome을 제어하는 ​​경우 User-Agent는 기본적으로 Google Chrome으로 설정되며 교체될 수 있습니다.

Selenium은 프록시 IP를 사용하여 브라우저를 제어할 수도 있습니다.

options = webdriver.ChromeOptions()
# 切换User-Agent
options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1')
# 设置代理
options.add_argument('--proxy-server=代理服务器地址') # 设置代理
browser = webdriver.Chrome('./chromedriver',chrome_options=options)

웹페이지 소스 코드 얻기

획득한 웹페이지 소스코드는 JS 페이지 실행 후의 결과 소스코드입니다.

browser.page_source

쿠키 작업

셀레늄은 페이지에서 쿠키를 처리하는 데 도움이 될 수 있습니다

获取所有Cookies
browser.get_cookies()

把cookie转化为字典
cookies_dict = {
    
    cookie['name']: cookie['value'] for cookie in browser.get_cookies()}

通过名字获取Cookie
browser.get_cookie()

添加Cookie
browser.add_cookie()

通过名字删除Cookie
browser.delete_cookie()

删除所有Cookie
browser.delete_all_cookies()

자바스크립트 실행

셀레늄을 사용하면 브라우저가 지정된 js 코드를 실행할 수 있습니다.

# js语句:滚动
js = 'window.scrollTo(0,document.body.scrollHeight)' 
# 执行js的方法
browser.execute_script(js) 

js ="alert("hello world")"
browser.execute_script(js)

페이지 대기 중

로딩 과정에서 페이지는 웹사이트 서버의 응답을 기다리는 데 시간이 걸리며, 이 과정에서 태그 요소가 아직 로딩되지 않은 동시에 데이터를 획득하여 브라우저가 태그 요소를 찾지 못하는 경우가 있습니다. 작동해야 하는 요소이므로 예외가 발생합니다. 이때 프로그램은 기다려야 하며, 세 가지 방법이 있습니다:

분류를 기다리는 셀레늄 페이지

强制等待
隐式等待
显式等待

1. 강제 대기

설정 시간이 너무 짧아서 요소가 로드되지 않습니다. 설정하는 데 시간이 너무 오래 걸리고 시간 낭비입니다.

time.sleep(秒数)

2. 숨겨진 기다림

Implicit Waiting은 요소 위치 지정을 목적으로 하며, Implicit Waiting은 일정 시간 내에 요소 위치 지정 성공 여부를 판단하는 시간을 설정하고, 완료되면 다음 단계로 진행합니다. 설정된 시간 내에 위치 결정에 실패하면 타임아웃 로딩이 보고됩니다.

browser.implicitly_wait(等待时间)

3. 명시적 대기, 각 요소는 자체 검사 조건을 정의할 수 있습니다.

몇 초마다 대기 조건이 충족되었는지 확인하고, 충족되면 대기를 중단하고 다음 코드를 계속 실행합니다. 도달하지 못한 경우 지정된 시간이 초과될 때까지 계속 대기하며 시간 초과 예외가 보고됩니다.

1. 페이지 대기를 수동으로 구현

t = time.time()
# 定义超时时间
timeout = 60

while True:
    try:
        # 超时时间间隔
        time.sleep(1)
        url_element = browser.find_element(BY.ID, "OK")
        break
    except:
        # 超时处理
        if time.time() - t > timeout:
            break
        pass

2. 명시적 대기 API 제공

# 等待对象模块
from selenium.webdriver.support.wait import WebDriverWait
# 导入等待条件模块
from selenium.webdriver.support import expected_conditions as EC
# 导入查询元素模块
from selenium.webdriver.common.by import By

# 使用selenium api 实现显性等待
# 创建等待对象,传入:浏览器对象、超时时间、检查元素时间间隔
wait = WebDriverWait(browser, 60, 0.1)
# 检查元素是否存在,参数是一个元祖,元祖内部描述等待元素查询方案
# EC.presence_of_element_located()
# 检查元素是否可见
# EC.visibility_of_element_located()
url_element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "OK")))

추천

출처blog.csdn.net/qq_38628046/article/details/129055814