Selenium知识点

tech2022-08-22  115

selenium文档: https://selenium-python-zh.readthedocs.io/en/latest/

selenium安装: pip install selenium (不行就加上 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com)

使用示例:

from selenium import webdriver from selenium.webdriver.common.keys import Keys # Keys模拟按键操作 # 配置浏览器 chrome_options = webdriver.ChromeOptions() # "--headless" 无头浏览 chrome_options.add_argument("--headless") #不加载图片 prefs = {"profile.managed_default_content_settings.images": 2} chrome_options.add_experimental_option("prefs", prefs) # 创建Chrome Webdriver实例 driver = webdriver.Chrome(chrome_options=chrome_options) driver.get("http://www.python.org") assert "Python" in driver.title elem = driver.find_element_by_name("q") # 先清除内容 elem.clear() # 相当于输入"pycon" elem.send_keys("pycon") elem.send_keys(Keys.RETURN) assert "No results found" in driver.page_source # quit将关闭整个浏览器,而close只会关闭一个标签页, 如果你只打开了一个标签页,大多数浏览器的默认行为是关闭浏览器;运行结束必须quit driver.close() driver.quit()

1、页面交互

打开页面:

url="https://www.baidu.com/" # 打开页面 driver.get(url) # 在浏览历史中前进或者后退 driver.forward() driver.back()

获取当前页面截图:

driver.save_screenshot('screenshot.png')

获取元素:

# 可以通过已知的id/name/xpath element = driver.find_element_by_id("kw") element = driver.find_element_by_name("wd") # 使用Xpath只返回查找到的第一个,若没有查找到抛出``NoSuchElementException``异常 element = driver.find_element_by_xpath("//input[@class='s_ipt']")

输入搜索的关键词:

element.clear() element.send_keys("selenium文档") # Keys.ENTER 按ernter键 element.send_keys(Keys.ENTER) # 提交 找到最近的表单,返回提交它。 如果调用的元素不再表单内,将会抛出``NoSuchElementException``异常: element.submit()

处理SELECT元素:

from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_name('name')) select.select_by_index(index) select.select_by_visible_text("text") select.select_by_value(value) # 取消所有选择 select.deselect_all() # 获得所有已选的选项 all_selected_options = select.all_selected_options # 获得所有选项 options = select.options

提交表单:

driver.find_element_by_id("submit").click()

拖放:

element = driver.find_element_by_name("source") target = driver.find_element_by_name("target") # ActionChains 处理鼠标相关操作 from selenium.webdriver import ActionChains action_chains = ActionChains(driver) action_chains.drag_and_drop(element, target).perform()

切换不同的窗口:

# 当前的窗口名 driver.title # driver.switch_to_window("windowName") 已经过期了改成.switch_to.window() driver.switch_to.window("windowName") # 查看所有窗口名 windows = driver.window_handles for i in windows: # driver.switch_to_window(i) driver.switch_to.window(i) print(driver.title) # 通过索引切换 windows = driver.window_handles # driver.switch_to.window(windows[-1]) driver.switch_to.window(windows[-1])

切换不同的frame:

driver.switch_to_frame("frameName") # 切换子frame driver.switch_to_frame("frameName.0.child") # 返回父frame driver.switch_to_default_content()

访问弹出的对话框:

alert = driver.switch_to_alert()

操作cookie:

# 获取cookie driver.get_cookies() # 添加cookie driver.add_cookie({'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BDSVRTM'}) # 删除指定cookie driver.delete_cookie("CookieName") # 删除所有cookie driver.delete_all_cookies()

2、查找元素

在一个页面中有很多不同的策略可以定位一个元素。Selenium提供了下列的方法:

find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text (通过链接文本获取超链接) find_element_by_partial_link_text (通过链接文本获取超链接) find_element_by_tag_name (通过标签名查找元素,h1、p、a标签这些的) find_element_by_class_name find_element_by_css_selector

一次查找多个元素 (这些方法会返回一个list列表):

find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector

还有两个私有方法, find_element 和 find_elements 。 用法示例:

from selenium.webdriver.common.by import By driver.find_element(By.XPATH, '//button[text()="Some text"]') driver.find_elements(By.XPATH, '//button')

下面是 By 类的一些可用属性:

ID = “id” XPATH = “xpath” LINK_TEXT = “link text” PARTIAL_LINK_TEXT = “partial link text” NAME = “name” TAG_NAME = “tag name” CLASS_NAME = “class name” CSS_SELECTOR = “css selector”

找不到元素时,抛出NoSuchElementException 异常。

通过链接文本获取超链接:

<a href="continue.html">Continue</a>

continue_link = driver.find_element_by_link_text(‘Continue’) continue_link = driver.find_element_by_partial_link_text(‘Conti’)

通过css选择器查找元素:

<p class="content">Site content goes here.</p>

content = driver.find_element_by_css_selector(‘p.content’)

3、等待页面加载 元素不再页面之中,会抛出 ElementNotVisibleException 异常。 (1) 显式等待 等待指定的条件满足时再执行代码

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) ) finally: driver.quit() # 在抛出TimeoutException异常之前将等待10秒或者在10秒内发现了查找的元素。

WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息) WebDriverWait()后有until(self, method, message)和until_not(self, method, mesage)两种方法

(2)隐式等待 等待一定时间后再开始查找元素,driver.implicitly_wait() 如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步

from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(10) # seconds driver.get("http://somedomain/url_that_delays_loading") myDynamicElement = driver.find_element_by_id("myDynamicElement"

(杂): Selenium之动作链(ActionChains) 用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等。而selenium给我们提供了一个类来处理这类事件——ActionChains 方法可以用.连接, 比如ActionChains().move_to_element(元素).click(元素).perform()

driver.execute_script(css_selector % keyword) 执行js

‘–ignore - ssl - errors’ 忽略ssl错误 ‘–ssl - protocol = TLSv1’ ssl协议使用TLSv1 chrome_options.add_argument(“service_args = [’–ignore - ssl - errors = true’, ‘–ssl - protocol = TLSv1’]”) self.driver.execute_script("$(’#mobile’).val(%s)" % self.phone) # 填写phone 分辨率设置 影响获取可见元素

driver.close() 必须关闭driver, driver.quit(), 否则还会有很多残留的缓存chrome/driver, lsof|grep chrome或driver|cut -c 11-15|xargs kill 清理缓存lsof|grep deleted|cut -c 11-15|xargs kill

最新回复(0)