Este artículo resume algunas operaciones comunes que se usarán cuando se use selenium para la automatización web/UI.
elemento de posicionamiento
driver.find_element_by_xpath()#1, ruta absoluta 2, atributo de elemento 3, combinación de jerarquía y atributo 4, use el operador lógico driver.find_element_by_id()#según el posicionamiento de id, HTML estipula que el atributo id debe ser el único controlador en Documento HTML . _ enlace de texto, necesita el elemento correspondiente Tiene atributo href driver.find_element_by_partial_link_text()#Posicionamiento borroso enlace de texto driver.find_element_by_css_selector()#CSS selector
Por posicionamiento de elementos
Es otra forma de posicionamiento de elementos, que es lo mismo que las 8 capas inferiores anteriores.
desde selenium.webdriver.common import By driver.find_element(By.ID,'kw')
localizar un conjunto de elementos
driver.find_elements_by_xpath()#Otros métodos son los mismoscontrolador.find_elements(Por.XPATH,'')
funcionamiento del navegador
driver.set_window_size()#Establece el tamaño del navegador, que puede ajustarse al tamaño del terminal móvil driver.back()#Navegador atrás driver.forward()#Navegador adelante driver.set_window_position() driver.set_window_rect() driver.refresh() #Simular actualización del navegador driver.maximize_window()#Maximizar navegador
Establecer parámetros del navegador
Al definir el controlador, establezca el parámetro chrome_options, que es un objeto instanciado por la clase Opciones. Entre ellos, los parámetros comúnmente utilizados son para establecer si se visualiza el navegador y la información del encabezado de solicitud del navegador. El primero puede acelerar la velocidad de ejecución del código, y el segundo puede prevenir de manera efectiva la detección anti-rastreador del sitio web.
from selenium.webdriver.chrome.options import Options
url='https://movie.douban.com/'
#Options类实例化
chrome_options=Options()
#设置浏览器参数
#--headless是不 显示浏览器启动和执行过程c
chrome_options.add_argument('--headless')
#设置lang和User-Agent信息,防止反爬虫检测
chrome_options.add_argument('lang=zh_CN.UTF-8')
UserAgent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.101 Safari/537.36'
chrome_options.add_argument('User-Agent='+UserAgent)
#启动浏览器并设置chrome_options参数
driver=webdriver.Chrome(options=chrome_options)
driver.get(url)
driver.maximize_window()
print(driver.title)
# print(driver.page_source) #获取网页的html代码
manipulación de elementos
driver.find_element_by_xpath().click()#hacer clic en el elemento driver.find_element_by_xpath().clear()#clear text driver.find_element_by_xpath().send_keys()#simular entrada de teclado
interacción de la página
La interfaz webElement proporciona algunos métodos que pueden interactuar con la página.
enviar y hacer clic son intercambiables en algunos casos, y enviar solo se usa para los botones de envío de formularios.
driver.find_element_by_xpath().submit()#Enviar el contenido del cuadro de entrada es similar a presionar Intro para enviar el contenido del cuadro de búsqueda driver.find_element_by_xpath().size#Return element size driver.find_element_by_xpath().text#Get texto del elemento driver.find_element_by_xpath() .get_attribute()#Obtener el valor del atributo del elemento driver.find_element_by_xpath().is_selected()#Si está seleccionado driver.find_element_by_xpath().is_enabled()#Juzgar si el elemento se puede utilizar driver.find_element_by_xpath ().is_displayed()#Return elemento si el usuario es visible
evento del ratón
Los métodos sobre las operaciones del mouse están encapsulados en Actionchains
from selenium.webdriver.common.action_chains import ActionChains rigt_check=driver.find_element_by_id('kw') ActionChains(driver).context_click(rigt_check).perform()#context_click realiza una operación de clic derecho en los elementos# perform() Ejecuta todas las acciones almacenadas en el comportamiento de ActionChains ActionChains(driver).move_to_element(rigt_check).perform()#Pase el mouse sobre ActionChains(driver).doble_clic(rigt_check).perform()#Haga doble clic con el mouse ActionChains(driver).drag_and_drop(source,target).perform( )# El ratón se arrastra desde el elemento de origen al elemento de destino
url='https://passport.bilibili.com/login'
driver=webdriver.Chrome()
driver.get(url)
#双击登录按钮
ele=driver.find_element_by_class_name('tit')
ActionChains(driver).double_click(ele).perform()
sleep(2)
#拖拽滑块
ele=driver.find_element_by_class_name('gt_slider_knob,gt_show')
ActionChains(driver).drag_and_drop_by_offset(ele,100,0).perform()
eventos de teclado
Simule la entrada de teclado, que puede ser una tecla o una combinación de teclas.
from selenium.webdriver.common.keys import Keys driver.find_element_by_xpath().send_keys(Keys.BACK_SPACE)#Opere el elemento una vez backspace driver.find_element_by_xpath().send_keys(Keys.SPACE)#Ingrese espacios para el elemento driver.find_element_by_xpath ( ).send_keys(Keys.CONTROL,'a')#ctrl+A seleccionar todo el contenido del cuadro de entrada driver.find_element_by_xpath().send_keys(Keys.CONTROL,'x')#ctrl+x cortar el contenido del cuadro de entrada driver.find_element_by_xpath () .send_keys(Keys.CONTROL,'v')#ctrl+v pega el contenido en el cuadro de entrada driver.find_element_by_xpath().send_keys(Keys.ENTER)#Reemplace la operación de clic con la tecla Enter driver.find_element_by_xpath().send_keys (Teclas.F1)#Teclado F1
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from time import sleep
url='https://www.baidu.com'
driver=webdriver.Chrome()
driver.get(url)
ele=driver.find_element_by_id('kw')
ele.send_keys("selenium")
sleep(2)
#删除最后一个文字
ele.send_keys(Keys.BACK_SPACE)
sleep(2)
#添加空格键+教程
ele.send_keys(Keys.SPACE)
ele.send_keys("教程")
sleep(2)
#ctrl+a全选输入框内容
ele.send_keys(Keys.CONTROL,'a')
sleep(2)
#ctrl+x 剪切输入框内容
ele.send_keys(Keys.CONTROL,'x')
sleep(2)
#ctrl+v 粘贴内容到输入框
ele.send_keys(Keys.CONTROL,'v')
sleep(2)
#回车键代替单击
driver.find_element_by_id('su').send_keys(Keys.ENTER)
Obtener información de verificación
Una vez completada la ejecución del caso de uso de automatización, se puede obtener cierta información de la página para probar el éxito o el fracaso de la ejecución del caso de uso.
driver.title #Obtener el título de la página driver.current_url#Obtener el enrollamiento de la página driver.find_element_by_xpath().text#Obtener el texto del elemento
elemento esperar
Dado que la mayoría de las páginas web utilizan la tecnología AJAX, cuando el navegador carga la página, es posible que los elementos de la página no se carguen al mismo tiempo y deban esperar.
Espera explícita: la espera explícita puede esperar de manera flexible de acuerdo con las condiciones del juicio. El programa lo detecta de vez en cuando. Si el resultado de la detección coincide con la condición, ejecutará el siguiente paso. De lo contrario, continuará esperando hasta el tiempo máximo. se supera el conjunto.
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import added_conditions as EC element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located(By.ID) ,'kw')) #Compruebe si este elemento se puede ubicar cada 0,5 segundos y el tiempo de espera se agota después de 5 segundos #expected_conditions proporciona muchos métodos de evaluación de condiciones esperadas #También puede usar is_displayed() para juzgar si el elemento es visible
espera implícita
La espera implícita se refiere a detectar si la página web se carga en un período de tiempo determinado, es decir, en circunstancias normales, el usuario no ejecutará el siguiente paso hasta que el pequeño círculo en la barra de pestañas del navegador no gire. Por ejemplo, si el tiempo de espera se establece en 30 segundos en el código, siempre que la página web termine de cargarse dentro de los 30 segundos, ejecutará automáticamente el siguiente paso y, si supera los 30 segundos, se generará una excepción. Vale la pena señalar que la espera implícita funciona en todo el ciclo del conductor, por lo que solo debe configurarse una vez.
Espere un cierto período de tiempo para completar la carga de un elemento en la página. Si el elemento no se ha cargado más allá del período de tiempo establecido, se lanzará una excepción de ningún elemento.
Por lo general, se coloca detrás del conductor.
conductor.implicitly_wait(10)
dormir método de sueño
Agregue donde sea necesario.
from time import sleep sleep(3)
La espera implícita y la espera explícita son más flexibles e inteligentes que la espera obligatoria de time.sleep, que puede resolver varios problemas de retraso de la red.La espera implícita y la espera explícita se pueden usar al mismo tiempo, pero el tiempo de espera más largo depende del número máximo entre los dos, si el tiempo de espera implícito del código anterior es de 30 segundos y el tiempo de espera explícito es de 20 segundos, entonces el tiempo de espera más largo del código es el tiempo de espera implícito.
Conmutación de múltiples cuadros
Frame es una página de marco, que ya no es compatible con HTML 5, pero aún se puede ver en algunos sitios web. La función del marco es anidar uno o más códigos HTML diferentes en el código HTML, y cada código HTML anidado debe ser realizado por el marco.
Las funciones implementadas por iframe y frame son las mismas, pero el uso y la flexibilidad son diferentes. Ya sea un iframe o un marco, el posicionamiento y el funcionamiento de Selenium son los mismos.
Dado que un HTML puede anidar uno o más iframes, Selenium necesita cambiar al iframe especificado a través de switch_to.frame() cuando opera diferentes iframes y luego realizar la operación correspondiente
driver.switch_to.frame('kw')#Puede tomar directamente el atributo id o name del formulario. Si el formulario no tiene estos dos atributos, primero puede ubicar el elemento del formulario y luego cambiar driver.switch_to.parent_frame ( ' kw') #Saltar del formulario de primer nivel actual . nombre atributo driver.switch_to_frame('framea') nueva versión driver.switch_to.frame(0)
Como el cuadro de texto que Baidu conoce
El siguiente código permite abrir la página del tema de Baidu Knowing, hacer clic en Deseo responder, navegar hasta el iframe, ingresar el contenido, salir del iframe y hacer clic en el botón Enviar respuesta.
url='https://zhidao.baidu.com/question/1903337615241287780.html'
driver=webdriver.Chrome()
driver.get(url)
driver.maximize_window()
#点击我要回答
driver.find_element_by_id('answer-bar').click()
#切换到frame内部的html
driver.switch_to.frame('ueditor_0')
#定位frame内部的元素
driver.find_element_by_xpath('/html/body').send_keys('美国')
#跳回网页HTML 如果不切回网页,则找不到提交回答按钮,且js代码也执行不了
# driver.switch_to.default_content()
js='window.scrollTo(0,100)'
driver.execute_script(js)
sleep(3)
#点击网页提交回答按钮
driver.find_element_by_xpath("//div[@class='addons line']/a").click()
Conmutación de múltiples ventanas
search_windows=driver.current_window_handle #Obtener el identificador de ventana actualall_handles=driver.window_handles #Obtener identificadores de todas las ventanasdriver.switch_to.window(handle)#cambiar ventanahandles=controlador.window_handles driver.switch_to_window(handles[0]) driver.switch_to_window(handles[1])
solicitud
from selenium import webdriver
from selenium.webdriver.common.by import By
url='https://www.baidu.com/'
driver=webdriver.Chrome()
driver.get(url)
driver.implicitly_wait(10)
search_windows=driver.current_window_handle #获得窗口句柄
driver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text('立即注册').click()
import time
#获得所有窗口的句柄
all_handles=driver.window_handles
#切换到注册窗口
for handle in all_handles:
if handle!=search_windows:
driver.switch_to.window(handle)
print("当前是注册窗口")
time.sleep(2)
#回到搜索窗口
for handle in all_handles:
if handle==search_windows:
driver.switch_to.window(handle)
print("当前是搜索窗口")
driver.find_element_by_id('TANGRAM__PSP_4__closeBtn').click()#关闭注册窗口
driver.find_element_by_id('kw').send_keys("selenium")
driver.find_element_by_id('su').click()
time.sleep(2)
driver.quit()
Manejo de cuadros de alerta
Es muy sencillo procesar las alertas, las confirmaciones y las solicitudes generadas por JavaScript en webdriver. El método específico consiste en usar el método switch_to_alert para ubicar las alertas, las confirmaciones y las solicitudes, y luego usar text/accept/dismiss/send_keys y otros métodos para operar. .
texto: devuelve la información de texto en alerta/confirmar/solicitar
accept(): acepta el cuadro de alerta existente
descartar (): descartar el cuadro de advertencia existente
send_keys: enviar texto al cuadro de alerta
Aplicar, cambiar a alerta como se muestra en la figura y aceptar
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from time import sleep
url='https://www.baidu.com/'
driver=webdriver.Chrome()
driver.get(url)
driver.maximize_window()
driver.implicitly_wait(10)
#鼠标悬停至设置链接
link=driver.find_element_by_id("s-usersetting-top")
ActionChains(driver).move_to_element(link).perform()
driver.find_element_by_link_text('搜索设置').click()
#保存设置
driver.find_element_by_class_name('prefpanelgo').click()
sleep(2)
#接受警告框
# driver.switch_to_alert().accept()
driver.quit()
subir archivos
La carga general de archivos es abrir la ventana de Windows y seleccionar el archivo local desde la ventana, pero el controlador web no puede operar el control de Windows.
1. Las cargas ordinarias pasan la ruta del archivo local como un valor a la etiqueta de entrada. Tenga en cuenta que debe ser una etiqueta de entrada.
2. Carga de complementos, carga basada en flash, js, Ajax y otras tecnologías
#Ubique el botón de carga, agregue un archivo local driver.find_element_by_name('file').send_keys("D:\\upload_file.txt")
Otro método es implementar la carga basada en el software AutoIt. Pero no se recomienda porque no está dentro del alcance de Python.
descargar archivo
webdriver permite configurar la ruta de descarga de archivos predeterminada, y el archivo se descargará y almacenará automáticamente en el directorio establecido
cookies operativas
¿En qué circunstancias se utiliza la operación de cookies? Cuando un desarrollador desarrolla una función, cuando el usuario inicia sesión, el nombre de usuario del usuario se escribirá en la cookie del navegador y la clave se especificará como nombre de usuario, luego se podrá encontrar el nombre de usuario a través de get_cookies() y se imprimirá el valor.
url='https://www.youdao.com/'
driver=webdriver.Chrome()
driver.get(url)
driver.maximize_window()
driver.implicitly_wait(10)
# #获得cookie
driver.add_cookie({'name':'Login_User','value':'Password'})
cookie=driver.get_cookies()
print("所有Cookie为",cookie)
#获取name为Login_User的cookie
one_cookie=driver.get_cookie('Login_User')
print("Login_User的Cookie为",one_cookie)
# "删除name为Login_User的cookie
driver.delete_cookie('Login_User')
surplus_cookies=driver.get_cookies()
print("剩余的cookie为:",surplus_cookies)
driver.delete_all_cookies()
surplus_cookies=driver.get_cookies()
print("剩余的cookie为:",surplus_cookies)
driver.quit()
El resultado devuelto es
所有Cookie为[{
'domain': 'www.youdao.com',
'httpOnly': False,
'name': '___rl__test__cookies',
'path': '/',
'secure': False,
'value': '1662293521877'
}, {
'domain': '.youdao.com',
'expiry': 1696853521,
'httpOnly': False,
'name': 'OUTFOX_SEARCH_USER_ID',
'path': '/',
'secure': False,
'value': '"[email protected]"'
}, {
'domain': 'www.youdao.com',
'httpOnly': False,
'name': 'Login_User',
'path': '/',
'secure': True,
'value': 'Password'
}, {
'domain': '.youdao.com',
'expiry': 1696853520,
'httpOnly': False,
'name': 'OUTFOX_SEARCH_USER_ID_NCOO',
'path': '/',
'secure': False,
'value': '1883563674.2397'
}]
Login_User的Cookie为 {
'domain': 'www.youdao.com',
'httpOnly': False,
'name': 'Login_User',
'path': '/',
'secure': True,
'value': 'Password'
}
剩余的cookie为: [{
'domain': 'www.youdao.com',
'httpOnly': False,
'name': '___rl__test__cookies',
'path': '/',
'secure': False,
'value': '1662293521877'
}, {
'domain': '.youdao.com',
'expiry': 1696853521,
'httpOnly': False,
'name': 'OUTFOX_SEARCH_USER_ID',
'path': '/',
'secure': False,
'value': '"[email protected]"'
}, {
'domain': '.youdao.com',
'expiry': 1696853520,
'httpOnly': False,
'name': 'OUTFOX_SEARCH_USER_ID_NCOO',
'path': '/',
'secure': False,
'value': '1883563674.2397'
}]
剩余的cookie为: []
Llamar Javascript
Se puede utilizar para controlar la barra de desplazamiento del navegador
url='https://www.baidu.com/'
driver=webdriver.Chrome()
driver.get(url)
driver.find_element_by_id('kw').send_keys("selenium")
driver.find_element_by_id('su').click()
driver.set_window_size(600,600)
#通过js设置浏览器窗口的滚动条位置
js="window.scrollTo(500,500);"
driver.execute_script(js)
captura de pantalla de la ventana
url='https://www.baidu.com/'
driver=webdriver.Chrome()
driver.get(url)
driver.find_element_by_id('kw').send_keys("selenium")
driver.find_element_by_id('su').click()
sleep(2)
driver.get_screenshot_as_file("C:\\Users\\yangyl13\\Desktop\\3.png")
driver.quit()
cerrar la ventana
driver.quit() #Salir del controlador relevante, cerrar todas las ventanas
driver.close()#Cerrar una sola ventana.
Procesamiento de código de verificación
1. Eliminar el código de verificación del entorno de prueba
2. Código de verificación universal
3. Tecnología de reconocimiento de código de verificación como python-tesseract
4. Registrar cookies
selección de cuadro desplegable
from selenium.webdriver.support.select import Select Select(driver.find_element_by_id('')).select_by_index('2')#Seleccionar según el índice del cuadro desplegable Seleccionar (driver.find_element_by_id('')).select_by_value( 'Python') #Seleccionar según el atributo de valor del cuadro desplegable Select(driver.find_element_by_id('')).select_by_visible_text('Python')#Seleccionar según el texto visible del cuadro desplegable