• 元素操作(一)


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

    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()
  • 相关阅读:
    继承
    面向对象
    数据库的数据操作
    数据库数据类型以及建库语句
    第一天
    继承与多态
    C#面向对象——对象成员、方法重载、引用类库等
    C#面向对象初步
    SQL2008知识回顾
    C#知识回顾
  • 原文地址:https://www.cnblogs.com/my_captain/p/9235233.html
Copyright © 2020-2023  润新知