元素操作(一)

一. 如何处理首次登陆的引导页面

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()
原文地址:https://www.cnblogs.com/my_captain/p/9235233.html