1、行为链类

有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。
导入:from selenium.webdriver.common.action_chains import ActionChains
使用:

  1. from selenium import webdriver
  2. from selenium.webdriver.common.action_chains import ActionChains
  3. driver = webdriver.Chrome()
  4. driver.get("https://www.baidu.com")
  5. action = ActionChains(driver)
  6. inputTag = driver.find_element_by_id("kw")
  7. submit = driver.find_element_by_id("su")
  8. # 移动到该标签
  9. action.move_to_element(inputTag)
  10. # 向当前所在的元素传值
  11. action.send_keys("java")
  12. # 向指定的元素传值
  13. # action.send_keys_to_element(inputTag, "python")
  14. # 点击元素
  15. action.click(submit)

注意:

  • 实例化使传入的是浏览器实例;
  • 每一次定义的行为链操作都需要使用perform()方法提交,否则定义的行为不会生效;

行为链其它的鼠标相关的操作

2、cookie操作

  • 获取所有的cookie

    1. cookies = driver.get_cookies()
  • 根据cookie的name获取cookie

    1. value = driver.get_cookie(key)
  • 删除某个cookie

    1. driver.delete_cookie('key')

3、页面等待

现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待;

  • 隐式等待:调用driver.implicitly_wait。 [ɪmˈplɪsətli] 那么在获取不可用的元素之前,会先等待10秒中的时间。
  • 在获取元素之前就设置等待,设置后,其后的元素定位都会进行等待寻找。
  1. from selenium import webdriver
  2. driver = webdriver.Chrome()
  3. driver.get("https://www.baidu.com/")
  4. # driver.implicitly_wait(10)
  5. inputTag = driver.find_element_by_id('kw')
  6. inputTag.send_keys("python")
  7. driver.implicitly_wait(10)
  8. submit = driver.find_element_by_id("sus")
  9. submit.click()
  10. driver.quit()
  • 显示等待:显示等待是表明某个条件成立后才执行获取元素的操作。也可以在等待的时候指定一个最大的时间,如果超过这个时间那么就抛出一个异常。显示等待应该使用selenium.webdriver.support.excepted_conditions期望的条件和selenium.webdriver.support.ui.WebDriverWait来配合完成。
  • WebDriverWait(driver, “最大等待时间”) ```python 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.Chrome() driver.get(“https://www.baidu.com/“) try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, “kw”)) ) driver.find_element_by_id(“kw”).send_keys(“python”) finally: driver.quit()

  1. 一些其他的等待条件
  2. - **presence_of_element_located**:某个元素已经加载完毕了。
  3. - presence_of_all_elements_located:网页中所有满足条件的元素都加载完毕了。
  4. - element_to_be_clickable:某个元素是可以点击了。
  5. 更多条件请参考:[http://selenium-python.readthedocs.io/waits.html](http://selenium-python.readthedocs.io/waits.html)
  6. <a name="ZRHn8"></a>
  7. ### 4、打开多窗口和切换页面
  8. 有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做**switch_to_window**来进行切换,具体切换到哪个页面,可以从**driver.window_handles[1]**中找到。<br />**<br />**打开一个新窗口**
  9. ```python
  10. driver.execute_script("window.open('url')")


切换窗口**

driver.switch_to_window(driver.window_handles[-1])
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.execute_script("window.open('https://www.douban.com/')")
print(driver.current_url)

driver.switch_to.window(driver.window_handles[2])
print(driver.current_url)


注意:**

  • driver.get(url)的窗口是主窗口,不需要切换,而execute创建的窗口是副窗口,需要进行切换才能获取到页面内容;
  • 注意每一次关闭了一个窗口,若要进行页面获取,必须再次选择窗口,否则报错说找不到当前窗口driver.switch_to_window(driver.window_handles[0])
  • 切换一般使用0,-1这两索引,以及close()关闭后,需先切换窗口,才可以重新创建;
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")

for i in range(3):
    driver.execute_script("window.open('https://www.douban.com/')")
    driver.switch_to.window(driver.window_handles[-1])

    driver.close()
    driver.switch_to.window(driver.window_handles[0])