1、行为链类
有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。
导入:from selenium.webdriver.common.action_chains import ActionChains
使用:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
action = ActionChains(driver)
inputTag = driver.find_element_by_id("kw")
submit = driver.find_element_by_id("su")
# 移动到该标签
action.move_to_element(inputTag)
# 向当前所在的元素传值
action.send_keys("java")
# 向指定的元素传值
# action.send_keys_to_element(inputTag, "python")
# 点击元素
action.click(submit)
注意:
- 实例化使传入的是浏览器实例;
- 每一次定义的行为链操作都需要使用perform()方法提交,否则定义的行为不会生效;
行为链其它的鼠标相关的操作
- click_and_hold(element):点击但不松开鼠标。
- context_click(element):右键点击。
- double_click(element):双击。
- 更多方法请参考:http://selenium-python.readthedocs.io/api.html
2、cookie操作
获取所有的cookie
cookies = driver.get_cookies()
根据cookie的name获取cookie
value = driver.get_cookie(key)
删除某个cookie
driver.delete_cookie('key')
3、页面等待
现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待;
- 隐式等待:调用driver.implicitly_wait。 [ɪmˈplɪsətli] 那么在获取不可用的元素之前,会先等待10秒中的时间。
- 在获取元素之前就设置等待,设置后,其后的元素定位都会进行等待寻找。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# driver.implicitly_wait(10)
inputTag = driver.find_element_by_id('kw')
inputTag.send_keys("python")
driver.implicitly_wait(10)
submit = driver.find_element_by_id("sus")
submit.click()
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()
一些其他的等待条件
- **presence_of_element_located**:某个元素已经加载完毕了。
- presence_of_all_elements_located:网页中所有满足条件的元素都加载完毕了。
- element_to_be_clickable:某个元素是可以点击了。
更多条件请参考:[http://selenium-python.readthedocs.io/waits.html](http://selenium-python.readthedocs.io/waits.html)
<a name="ZRHn8"></a>
### 4、打开多窗口和切换页面
有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做**switch_to_window**来进行切换,具体切换到哪个页面,可以从**driver.window_handles[1]**中找到。<br />**<br />**打开一个新窗口**
```python
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])