爬虫笔记:Selenium(十一)
selenium用法总结,前面的博客也有写,知识在爬虫这块总结下:
from selenium import webdriver # 要想调用键盘按键操作需要引入keys包 from selenium.webdriver.common.keys import Keys # 调用环境变量指定的Chrome浏览器创建浏览器对象 driver = webdriver.Chrome() # get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2) driver.get("http://www.baidu.com/") # 获取页面名为 wrapper的id标签的文本内容 data = driver.find_element_by_id("wrapper").text # 打印数据内容 print(data) # 打印页面标题 "百度一下,你就知道" print(driver.title) # 生成当前页面快照并保存 driver.save_screenshot("baidu.png") # id="kw"是百度搜索输入框,输入字符串"长城" driver.find_element_by_id("kw").send_keys("长城") # id="su"是百度搜索按钮,click() 是模拟点击 driver.find_element_by_id("su").click() # 获取新的页面快照 driver.save_screenshot("长城.png") # 打印网页渲染后的源代码 print(driver.page_source) # 获取当前页面Cookie print(driver.get_cookies()) # ctrl+a 全选输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a') # ctrl+x 剪切输入框内容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') # 输入框重新输入内容 driver.find_element_by_id("kw").send_keys("itcast") # 模拟Enter回车键 driver.find_element_by_id("su").send_keys(Keys.RETURN) # 清除输入框内容 driver.find_element_by_id("kw").clear() # 生成新的页面快照 driver.save_screenshot("baidu.png") # 获取当前url print(driver.current_url) # 关闭当前页面,如果只有一个页面,会关闭浏览器 # driver.close() # 关闭浏览器 driver.quit()
页面操作
Selenium 的 WebDriver提供了各种方法来寻找元素,假设下面有一个表单输入框:
<input type="text" name="user-name" id="passwd-id" />
# 获取id标签值 element = driver.find_element_by_id("passwd-id") # 获取name标签值 element = driver.find_element_by_name("user-name") # 获取标签名值 element = driver.find_elements_by_tag_name("input") # 也可以通过XPath来匹配 element = driver.find_element_by_xpath("//input[@id='passwd-id']")
定位UI元素 (WebElements)
关于元素的选取,有如下的API 单个元素选取或者多个元素的选取,带elements的都是多个元素的,返回的是list
find_element_by_id 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
下面是各种选择器的用法
#id选择器 element = driver.find_element_by_id("coolestWidgetEvah") ------------------------ or ------------------------- from selenium.webdriver.common.by import By element = driver.find_element(by=By.ID, value="coolestWidgetEvah") #Class 选择器 cheeses = driver.find_elements_by_class_name("cheese") ------------------------ or ------------------------- from selenium.webdriver.common.by import By cheeses = driver.find_elements(By.CLASS_NAME, "cheese") #标签选择器 frame = driver.find_element_by_tag_name("iframe") ------------------------ or ------------------------- from selenium.webdriver.common.by import By frame = driver.find_element(By.TAG_NAME, "iframe") #name属性选择 cheese = driver.find_element_by_name("cheese") ------------------------ or ------------------------- from selenium.webdriver.common.by import By cheese = driver.find_element(By.NAME, "cheese") #超链接的文字选择 #<a href='http://www.nnzhp.cn'>牛牛博客<a> heese = driver.find_element_by_link_text("牛牛博客") ------------------------ or ------------------------- from selenium.webdriver.common.by import By cheese = driver.find_element(By.LINK_TEXT, "牛牛博客") #超链接部分文字选择,上面那个是全部的文字一样才可以,这个只是一部分就ok了 # <a href='http://www.nnzhp.cn'>牛牛博客<a> cheese = driver.find_element_by_partial_link_text("牛牛") ------------------------ or ------------------------- from selenium.webdriver.common.by import By cheese = driver.find_element(By.PARTIAL_LINK_TEXT, "牛牛") #css选择器 cheese = driver.find_element_by_css_selector("#food span.dairy.aged") ------------------------ or ------------------------- from selenium.webdriver.common.by import By cheese = driver.find_element(By.CSS_SELECTOR, "#food span.dairy.aged") #xpath选择器 inputs = driver.find_elements_by_xpath("//input") ------------------------ or ------------------------- from selenium.webdriver.common.by import By inputs = driver.find_elements(By.XPATH, "//input")
鼠标动作链
有些时候,我们需要再页面上模拟一些鼠标操作,比如双击、右击、拖拽甚至按住不动等,我们可以通过导入 ActionChains 类来做到:
#导入 ActionChains 类 from selenium.webdriver import ActionChains # 鼠标移动到 ac 位置 ac = driver.find_element_by_xpath('element') ActionChains(driver).move_to_element(ac).perform() # 在 ac 位置单击 ac = driver.find_element_by_xpath("elementA") ActionChains(driver).move_to_element(ac).click(ac).perform() # 在 ac 位置双击 ac = driver.find_element_by_xpath("elementB") ActionChains(driver).move_to_element(ac).double_click(ac).perform() # 在 ac 位置右击 ac = driver.find_element_by_xpath("elementC") ActionChains(driver).move_to_element(ac).context_click(ac).perform() # 在 ac 位置左键单击hold住 ac = driver.find_element_by_xpath('elementF') ActionChains(driver).move_to_element(ac).click_and_hold(ac).perform() # 将 ac1 拖拽到 ac2 位置 ac1 = driver.find_element_by_xpath('elementD') ac2 = driver.find_element_by_xpath('elementE') ActionChains(driver).drag_and_drop(ac1, ac2).perform()
处理下拉框
我们已经知道了怎样向文本框中输入文字,但是有时候我们会碰到<select> </select>
标签的下拉框。直接点击下拉框中的选项不一定可行。
Selenium专门提供了Select类来处理下拉框。 其实 WebDriver 中提供了一个叫 Select 的方法,可以帮助我们完成这些事情:
# 导入 Select 类 from selenium.webdriver.support.ui import Select # 找到 name 的选项卡 select = Select(driver.find_element_by_name('status')) select.select_by_index(1)#根据索引 select.select_by_value("0")#根据value select.select_by_visible_text("未审核") select.deselect_all()#取消选择
弹窗处理
当你触发了某个事件之后,页面出现了弹窗提示,处理这个提示或者获取提示信息方法如下:
alert = driver.switch_to_alert()
页面切换、页面前进和后退
一个浏览器肯定会有很多tab页,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:
driver.switch_to.window("this is window name") #也可以使用 window_handles 方法来获取每个tab页的操作对象 for handle in driver.window_handles: driver.switch_to_window(handle) driver.forward() #前进 driver.back() # 后退
操作Cookies
#获取页面每个Cookies值 for cookie in driver.get_cookies(): print ("%s -> %s" % (cookie['name'], cookie['value'])) #删除Cookies # By name driver.delete_cookie("CookieName") # all driver.delete_all_cookies()
页面等待
页面等待非常重要,因为我们在打开一个网站的时候,由于网速或者其他原因,页面没有加载全,这时候可能咱们想要找的元素还没有出现,运行代码的时候就会报错了。找不到该元素。
为了避免这种情况的出现,selenium里面有2种等待元素加载完成的方式,一种是隐式等待,一种是显示等待。前者就比较傻瓜了,就是固定等一个时间,过了时间就继续执行下面的代码,和sleep差不多。后者是指定一个最长的等待时间,在这个时间内它会一直检查这个元素有没有被加载出来,如果被加载出来,那么就不等待了,继续执行;如果超过最长的等待时间,那么就会抛出异常。
显示等待
from selenium import webdriver from selenium.webdriver.common.by import By # WebDriverWait 库,负责循环等待 from selenium.webdriver.support.ui import WebDriverWait # expected_conditions 类,负责条件出发 from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("http://www.xxxxx.com/loading") try: # 页面一直循环,直到 id="myDynamicElement" 出现 element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) ) finally: driver.quit() 如果不写参数,程序默认会 0.5s 调用一次来查看元素是否已经生成,如果本来元素就是存在的,那么会立即返回。 下面是一些内置的等待条件,你可以直接调用这些条件,而不用自己写某些等待条件了 title_is #标题是xx title_contains #标题包含xx presence_of_element_located #元素是否被加载 visibility_of_element_located #元素是否被加载,可见代表元素可显示且宽和高都大于0 visibility_of #判断元素是否可见 presence_of_all_elements_located #判断是否至少有1个元素被加载,如果定位到就返回列表 text_to_be_present_in_element #判断指定的元素中是否包含了预期的字符串,返回布尔值 text_to_be_present_in_element_value#判断指定元素的属性值中是否包含了预期的字符串,返回布尔值 frame_to_be_available_and_switch_to_it#判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False invisibility_of_element_located #判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素 element_to_be_clickable #元素可以点击 staleness_of #等待某个元素从dom树中移除 element_to_be_selected #判断某个元素是否被选中了,一般用在下拉列表' element_located_to_be_selected #一个期望的元素位于被选中 element_selection_state_to_be #判断某个元素的选中状态是否符合预期 element_located_selection_state_to_be #期望找到一个元素并检查是否选在状态 alert_is_present # 预期一个警告信息
隐式等待
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # seconds driver.get("http://www.xxxxx.com/loading") myDynamicElement = driver.find_element_by_id("myDynamicElement")