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

    方法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中如何保证操作元素的成功率?也就是说不管网络加载慢还是快
    如果一个元素今天能定位到,过几天就定位不到了,只要这个页面没变过,说明定位方法是没问题的。
    
    优化方向:
    
    不要右键复制xpath,自己写相对路径,多用id为节点查找
    定位没问题,第二个影响因素就是等待时间了。sleep等待尽量少用(影响执行时间)。driver.implicity_wait(10)隐式等待也不要用,不要以为是全局的就是好事。有些JS加载失败时候会一直等,并且页面跳转时也无法识别。
    定位元素方法重新封装,结合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呢?
    
     
    没有借口
  • 相关阅读:
    【代码笔记】Java连连看项目的实现(1)——JTable 、TableModel的使用
    【代码笔记】多线程游戏开发——伏魔记:第一步——开始游戏界面实现(一)
    【代码笔记】Java基础:Java的方法和类
    【代码笔记】Java基础:类的继承(构造器)
    【代码笔记】XML深入学习:DTD约束与DTD语法(2)
    常见标签的全称
    CSS中margin与padding的区别
    jquery 执行语句无响应
    jquery autocomplete插件结合ajax使用
    在使用flask_Bootstrap的时候先加载了jquery-ui然后再加载jQuery,导致jQuery-ui无法使用。
  • 原文地址:https://www.cnblogs.com/wutao1935/p/15587448.html
Copyright © 2011-2022 走看看