zoukankan      html  css  js  c++  java
  • selenium中隐藏元素、动态元素如何定位?

    1、如何判断一个页面上元素是否存在?

    判断元素存在方法有3种:(存在返回True,不存在返回False)

    方法1:用try…except…

    def is_element_exsist1(driver, locator):
        """
        :param driver: webdriver
        :param locator: tuple
        :return: bool
        """
        try:
            driver.find_element(*locator)
            return True
        except Exception as msg:
            print("元素 %s 找不到:%s" %(locator, msg))
            return False
        
    if __name__ == '__main__':
        driver = webdriver.Chrome()
        loc1 = ("id", "bibi")
        print(is_element_exsist1(driver,loc1))

    方法2:用elements定义一组元素方法

    def is_element_exsist2(driver, locator):
        """
        :param driver: webdriver
        :param locator: tuple
        :return: bool
        """
        eles = driver.find_elements(*locator)
        if len(eles) < 1:
            return False
        else:
            return True
        
    if __name__ == '__main__':
        driver = webdriver.Chrome()
        # loc1 = ("id", "bibi")
        # print(is_element_exsist1(driver,loc1))
        loc2 = ("id", "bibi")
        print(is_element_exsist2(driver, loc2))

    方法3:结合WebDriverWait和excepted_conditions判断 (强烈推荐!!!)

    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    
    def is_element_exsist3(driver, locator):
        """
        :param driver: webdriver
        :param locator: tuple
        :return: bool
        """
        try:
            WebDriverWait(driver, 30, 1).until(EC.presence_of_element_located(locator))
            return True
        except :
            return False
    
    if __name__ == '__main__':
        driver = webdriver.Chrome()
        # loc1 = ("id", "bibi")
        # print(is_element_exsist1(driver,loc1))
        # loc2 = ("id", "bibi")
        # print(is_element_exsist2(driver, loc2))
        loc3 = ("id", "bibi")
        print(is_element_exsist3(driver, loc3))

    2、如何提高脚本的稳定性

    类似问题还有:

    • 用例在运行过程中经常会出现不稳定的情况,也就是说这次可以通过,下次就没办法通过了,如何去提升用例的稳定性?
    • 如何提高selenium脚本的执行速度?
    • selenium中如何保证操作元素的成功率?也就是说不管网络加载慢还是快

    如果一个元素今天能定位到,过几天就定位不到了,只要这个页面没变过,说明定位方法是没问题的。

    优化方向:

    1. 不要右键复制xpath,自己写相对路径,多用id为节点查找
    2. 定位没问题,第二个影响因素就是等待时间了。sleep等待尽量少用(影响执行时间)。driver.implicity_wait(10)隐式等待也不要用,不要以为是全局的就是好事。有些JS加载失败时候会一直等,并且页面跳转时也无法识别。
    3. 定位元素方法重新封装,结合WebDriverWait和excepted_conditions判断元素方法,自己封装一套定位元素方法
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    
    def find_ele(driver, locator, timeout=30):
        ele = WebDriverWait(driver, timeout, 1).until(EC.presence_of_element_located(locator))
        return ele

    3、如何定位动态元素

    动态元素有2种情况,一个是属性动态,比如id是动态的,定位时那就不要用id定位。还有一种情况动态的,那就是这个元素一会在页面上方,一会在下方,飘忽不定的动态元素,定位方法一样按F12,根据元素属性定位(元素的tag、name的步伐属性是不会变的,动的只是class属性和styles属性)。

    4、如何通过子元素定位父元素

    selenium里通过父元素定位子元素,可以通过二次定位来找到该元素。

    ele=driver.find_element_by_id("parent").find_element_by_id("child")

    5、子元素定位父元素

    可以通过xpath的语法直接定位:.//*[@name="hell"]/.. 两个点就是代表父级元素了。

    6、一个元素明明定位到了,点击无效(也没报错),如何解决?

    使用js点击,selenium有时点击元素是会失效的

    # js点击
    js = 'document.getElementById("baidu").click()'
    driver.execute_script(js)

    7、隐藏元素

    元素的属性隐藏和显示,主要是 type="hidden"和style="display:none;"属性来控制的

    定位 type="hidden"隐藏元素

    ele=driver.find_element_by_id("p")
    print("打印元素信息:%s" %ele)

    获取元素属性

    print(ele.get_attribute("name"))

    判断元素是否隐藏

    print(ele.is_displayed())

    隐藏元素用普通定位方法,事实上是定位到了。

    8、操作隐藏元素

    隐藏元素可以正常定位到,只是不能操作。操作元素是click,clear,send_keys这些方法。

    隐藏输入框元素输入文本:隐藏元素用send_keys()方法会抛异常 ElementNotVisibleException。这个报错是说元素不可见,不可以被操作。

    JS操作隐藏元素

    selenium是无法操作隐藏元素的(但是能正常定位到),本身这个框架就是设计如此。如果非要去操作隐藏元素,那就用js的方法去操作,selenium提供了一个入口可以执行js脚本。

    js和selenium不同,只要页面上有的元素(在dom里面的)都能正常的操作。

    js点击hidden元素

    js = 'document.getElementById("baidu").click()'
    driver.execute_script(js)

    运行完之后,会发现页面正常点击了

    备注:百度搜到的可能方法是先用js去掉hidden属性,再用selenium操作,这样有点多此一举了。既然都已经会用js了,何必不一次性到位直接click呢?

  • 相关阅读:
    CodeForces 347B Fixed Points (水题)
    CodeForces 347A Difference Row (水题)
    CodeForces 346A Alice and Bob (数学最大公约数)
    CodeForces 474C Captain Marmot (数学,旋转,暴力)
    CodeForces 474B Worms (水题,二分)
    CodeForces 474A Keyboard (水题)
    压力测试学习(一)
    算法学习(一)五个常用算法概念了解
    C#语言规范
    异常System.Threading.Thread.AbortInternal
  • 原文地址:https://www.cnblogs.com/String-song/p/14304230.html
Copyright © 2011-2022 走看看