wutao1935

导航

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呢?

 

 

posted on 2021-11-22 10:27  逐风浪子  阅读(1009)  评论(0编辑  收藏  举报