元素操作(一)
一. 如何处理首次登陆的引导页面
refresh():页面刷新。可以再浏览器中刷新一下,就可以取消引导页
二. 操作页面弹出框中的元素
1. 强制等待 sleep(秒)
比如百度首页的登录弹出框,在访问百度的时候,它就在html页面中出现了,只不过默认display:none,没有展示而已(这种弹出框只是修改display属性为block,所以系统响应应该非常快),对于这种情况,需要等待弹出框出现,才能进行下一步操作,所以需要设置等待时间
访问百度首页登录代码如下:
from selenium import webdriver import time #初始化chromedriver driver = webdriver.Chrome() #驱动浏览器访问百度首页 driver.get("http://www.baidu.com") #利用xpath定位百度首页的登录,并点击 driver.find_element_by_xpath("//*[@id='u1']//a[@name='tj_login']").click() #强制等待2s time.sleep(2) #利用id定位用户名登录,并点击 driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click()
还有一种情况,提交表单数据后,会看到一个进度条,这意味着系统正与服务器进行交互,只有交互之后,才能看到页面的变化。这时候,就不能确定加载时间是多少,因为和网络、服务器的性能有关。这里就要用到隐性等待
2. 隐性等待 implicitly_wait(秒)
设置最长等待时间,在这个时间内加载完成,则执行下一步,比如设置30s隐性等待,在3s内就能切换到页面,就不会再继续等下去,而是进入下一步
整个driver的会话(从建立连接到断开连接 )周期内,设置一次即可,全局都可用
继续用上面的例子做修改,修改后的百度登录代码如下:
from selenium import webdriver #初始化chromedriver,建立连接 driver = webdriver.Chrome() #隐性等待30s,应该在建立连接之后设置 driver.implicitly_wait(30) #驱动浏览器访问百度首页 driver.get("http://www.baidu.com") #利用xpath定位百度首页的登录,并点击 driver.find_element_by_xpath("//*[@id='u1']//a[@name='tj_login']").click() #利用id定位用户名登录,并点击 driver.find_element_by_id("TANGRAM__PSP_10__footerULoginBtn").click() #断开连接,必须用driver.quit()而非close() #driver.quit()
注意:观察到当python脚本运行结束时,进程中的chromedriver.exe会消失,但这并不意味着会话的结束,一个会话的结束是以关闭浏览器,断开连接为标准的(chromedriver.exe进程,在会话当中很重要,是一部分,但并不是全部。所以即便chromedriver.exe没了,会话仍然没有正确结束。因为除了启动chromedriver.exe之外,还有其它初始化的配置项)
另一种更高级的情况是,我在百度里搜索"selenium",需要等到另外一个页面的弹出框出现之后,才会对它进行操作,这时需要用到显性等待
3. 显性等待
明确等到某个条件满足之后,再去执行下一步的操作
程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
WebDriverWait类:显性等待类
WebDriverWait(driver, 等待时长, 轮询周期).until/until_not
-
driver:表示本次会话中的driver
-
等待时长:最长的等待时间
-
轮询周期:多久去看一眼
-
until:直到条件成立;until_not:直到条件不成立
Expected_conditions类:提供了一系列周期发生的条件
presence_of_element_located:元素存在
visibility_of_element_located:元素可见
element_to_be_clickable:元素可点击
ps:这个类有很多判断方法,具体自行了解
使用之前,引入相关的库:
from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By
使用方法:
1) 先确定元素的定位表达式 web_locator='XXXX'
2) 调用WebDriverWait类设置等待总时长、轮询周期,并调用其until、until_not方法
WebDriverWait(webdriver对象名, 等待总时长, 轮询周期).until(判断条件)
3) 使用expected_conditions对应的方法来生成判断条件
EC.方法名((定位方式, 定位表达式))
如:EC.presence_of_element_located((By.CSS_SELECTOR, web_locator))
继续修改上面的代码,如下所示:
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By #初始化chromedriver,建立连接 driver = webdriver.Chrome() #驱动浏览器访问百度首页 driver.get("http://www.baidu.com") #利用xpath定位百度首页的登录,并点击 driver.find_element_by_xpath("//*[@id='u1']//a[@name='tj_login']").click() #1. 先确定要找的元素的表达式 2.设置WebDriverWait类的参数和条件 login_popup_id = "TANGRAM__PSP_10__footerULoginBtn" WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((By.ID, login_popup_id))) #元素可见的话再点击 driver.find_element_by_id(login_popup_id).click()