Operaciones comunes de Selenium para la automatización web

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 mismos
controlador.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 actual
all_handles=driver.window_handles #Obtener identificadores de todas las ventanas
driver.switch_to.window(handle)#cambiar ventana
handles=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

Supongo que te gusta

Origin blog.csdn.net/seanyang_/article/details/126685726
Recomendado
Clasificación