Comandos comunes de selenio
Depuración remota de Chrome
Para evitar que el navegador sea detectado como controlado por un programa automatizado, podemos usar la depuración remota de Chrome combinada con selenio para controlar de forma remota Chrome y evitar el monitoreo.
Primero use cmd para agregar parámetros de inicio adicionales para el inicio de chrome.exe
# 如果chrome.exe未在环境变量中配置,需进入目录下运行
cd C:\Program Files (x86)\Google\Chrome\Application
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile" --profile-directory="Profile 1"
- Presta atención al puerto que no se debe ocupar
- user-data-dir: especifique el directorio del archivo de configuración, use el usuario predeterminado que puede ignorar
- profile-directory especifica el usuario del navegador, el usuario predeterminado se puede ignorar
Ajustes de configuración comunes de Chrome
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
chrome_options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
chrome_options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度
chrome_options.add_argument('--headless') # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
# 添加User-Agent
chrome_options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')
chrome_options.add_argument('--proxy-server=http://') # 使用代理IP登录浏览器
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") # 使用远程调试端口操作浏览器,避免被监测为正在使用自动化程序控制
# 禁用浏览器弹窗
prefs = {
'profile.default_content_setting_values' : {
'notifications' : 2 }}
chrome_options.add_experimental_option('prefs',prefs)
#禁止插件
chrome_options.add_argument('--disable-plugins')
# 禁用弹出拦截
chrome_options.add_argument('--disable-popup-blocking')
from selenium import webdriver
# 创建WebDriver对象(通常默认为wd),指明Chrome浏览器驱动,并添加上述配置
wd = webdriver.Chrome(
executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe',
options=chrome_options,
)
- ejecutable_path es la ruta del chromedriver.exe descargado, si se coloca en el entorno de Python, puede ignorar esta opción
Instrucciones comunes de Webdriver
- Establecer el tamaño de la ventana del navegador
# 窗口最大化
wd.maximize_window()
# 设置窗口指定大小
wd.set_window_size(1920, 1080)
- Deje que el navegador abra la URL especificada
wd.get('https://www.baidu.com')
- Establecer el tiempo máximo de espera
from selenium.webdriver.support.ui import WebDriverWait
wait = WebDriverWait(driver, 15)
- Cerrar la ventana del navegador
wd.close() # 关闭当前窗口
wd.quit() # 关闭浏览器
Ver y seleccionar elementos en el navegador
Si desea conocer las características de los elementos web. Puede utilizar la barra de herramientas para desarrolladores del navegador para ayudarnos a ver y seleccionar elementos web. (Seleccione el elemento, haga clic con el botón derecho para verificar, puede ver el elemento HTML correspondiente a la página)
Elemento de posicionamiento
wd = webdriver.Chrome()
A través de las instrucciones anteriores, asignamos un objeto tipo WebDriver a wd, de modo que podamos usar este objeto para controlar el navegador, como abrir la URL, seleccionar elementos de la interfaz, etc.
El código de abajo
wd.find_element_by_id('kw')
Utilice el método find_element_by_id del objeto WebDriver,
Hay muchas formas de ubicar elementos en el objeto WebDriver. Entre ellos están:
# 根据 元素的id 属性选择元素
find_element_by_id
# 根据 class属性、tag名 选择元素
find_element_by_tag_name
find_element_by_class_name
# 根据 元素的css 属性选择元素
find_element_by_css_selector
# 根据xpath来选择元素
find_element_by_xpath
Seleccionar elementos según su atributo de identificación
Según los atributos de las etiquetas en el html anterior, podemos encontrar un atributo id cuyo valor de atributo es kw.
En html, id se puede usar como el número de un elemento. Si el elemento tiene un atributo id, entonces este id es único y único.
Por lo tanto, si el elemento tiene un id, es la forma más sencilla y eficiente de encontrar el elemento basándose en el id.
Ejemplo:
wd.find_element_by_id('kw')
Una vez que el navegador encuentra el elemento cuya identificación es kw, devuelve el resultado al programa de automatización a través del controlador del navegador, por lo que el método find_element_by_id devolverá un objeto de tipo WebElement. A través de este objeto WebElement, puede manipular los elementos de interfaz correspondientes.
# 找到元素后点击
wd.find_element_by_id('kw').click()
# 找到元素后传递字符串
wd.find_element_by_id('kw').send_keys('')
Seleccione el elemento según el atributo de clase del elemento y el nombre de la etiqueta.
Además de la identificación del elemento, también podemos seleccionar el elemento en función del atributo de clase del elemento.
Hay tipos de elementos y el atributo de clase se usa para marcar el tipo de elemento. En una página html específica, dado que los tipos de elementos pueden ser los mismos, podemos usar find_elements para ubicar todos los elementos del mismo tipo en el posicionamiento real.
P.ej:
wd.find_elements_by_class_name('s_ipt')
De manera similar, podemos usar el método find_elements_by_tag_name para seleccionar todos los elementos cuyo nombre de etiqueta es input
wd.find_elements_by_tag_name('input')
Nota:
Mediante el objeto WebElement text属性
puede obtener el contenido de texto del elemento en una página web.
element = wd.find_elements_by_class_name('s_ipt')
print(element.text)
Si ninguno de los métodos anteriores puede localizar el control, es probable que esté en el iframe, el siguiente es el método para cambiar al iframe
driver.switch_to.frame() #转入网页内iframe(内嵌的网页元素)
driver.switch_to.parent_frame() #切回上一层frame
driver.switch_to_default_content() #返回到主页面
La diferencia entre find_element y find_elements
Utilice find_elements para seleccionar todos los elementos que cumplan las condiciones. Si no hay elementos que cumplan las condiciones, devuelva una lista vacía
Use find_element para seleccionar el primer elemento que cumpla con la condición, si no hay ningún elemento que cumpla con la condición, arroje NoSuchElementException
Cambiar ventana web
driver.execute_script('window.open()') # 开启一个选项卡
windows=driver.window_handles # 获得当前浏览器所有窗口
driver.switch_to.window(windows[0]) # 切换到最左侧窗口
driver.switch_to.window(windows[-1]) # 切换到最新打开窗口(注:也就是最右侧窗口)
enviar formulario
El método submit () se usa para enviar el formulario, especialmente cuando no hay un botón de enviar
Por ejemplo, la operación "Enter" después de ingresar una palabra clave en el cuadro de búsqueda, luego puede enviar el contenido del cuadro de búsqueda a través de enviar ().
driver.find_element_by_id('query').submit()
Obtener información de la página
driver.current_url # 获取当前网址
driver.page_source # 获取源代码
driver.title # 获取当前页面标题内容
driver.delete_all_cookies() # 删除所有cookie
driver.add_cookie({
'name':5}) # 添加cookie
- Obtener cookies
driver.get_cookies()
cookie_list = []
for dict in cookies:
cookie = dict['name'] + '=' + dict['value']
cookie_list.append(cookie)
cookie = ';'.join(cookie_list)
Espera implícita y espera explícita
Espera implícita
Cuando no se encuentra un elemento, no devuelve inmediatamente un error de que el elemento no se puede encontrar. En su lugar, busque el elemento periódicamente (cada medio segundo) hasta que se encuentre el elemento o se exceda el tiempo de espera máximo especificado, luego se lanza una excepción (si es un método como find_elements, se devuelve una lista vacía) .
El objeto Webdriver de Selenium tiene un método llamado implicitly_wait
Este método acepta un parámetro para especificar el tiempo máximo de espera.
# 设置缺省等待时间
driver.implicitly_wait(10)
Espera explícita
Como su nombre lo indica, la espera explícita es establecer un tiempo de espera fijo después de ejecutar el código y luego continuar ejecutándose, el método de suspensión comúnmente utilizado del módulo de tiempo
Este método acepta un parámetro para especificar el tiempo máximo de espera.
import time
time.sleep(1)
El objeto río tiene un método llamado implicitly_wait
Este método acepta un parámetro para especificar el tiempo máximo de espera.
# 设置缺省等待时间
driver.implicitly_wait(10)
Espera explícita
Como su nombre lo indica, la espera explícita es establecer un tiempo de espera fijo después de ejecutar el código y luego continuar ejecutándose, el método de suspensión comúnmente utilizado del módulo de tiempo
Este método acepta un parámetro para especificar el tiempo máximo de espera.
import time
time.sleep(1)