Selenium 元素等待


Selenium 元素等待

1:强制等待 time.sleep()

  ==》这个就很好理解, 比如time.sleep(5), 强制等待5s, 即使可能一两秒我想要定位的元素就已经加载完成了,但是我还是要等够5s之后才会执行下面的代码

2:隐式等待:driver.implicitly_wait(5)

  ==》在设置的等待时间内不断轮询去找元素,找不到就报错。

  ==》该方式是全局的,设置一次,对该代码后面的所有查找元素的代码都有效

  ==》该方式要等页面元素全局加载完成(即页面不刷新,不转了),才会去执行后面的代码。

    弊端:可能自己想定位的那个元素已经加载好了,但是不能去执行该元素的定位,还是要继续等页面加载完成才会去指定自己想要定位的那个元素的定位。

3:显式等待: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) )

  ==》仅对要找的那个元素有效

  ==》在规定的时间内,找不到就一直等待。超过规定的等待时间就报错

关于元素定位,自己之前的一些误解:

以前我以为,页面的元素总归是定义在html里的,即使由于某种原因还没显示出来,那么元素总归是存在的,只要元素的位置,属性什么没变化的话,那么久应该能定位的到,为什么非要等页面显示该元素才可以去定位?????

后来请教了公司的前端同事,才恍然大悟:

比如:百度首页上面这行导航栏,通过元素查找可以看到都存在于一个div标签下面。有可能这个div标签是定义在HTML里的,但是div里面的每个标签(a标签)并不是定义在HTML里的,而是通过js写进去的。

所以,比如在页面渲染好之后,我们确定了比如:“新闻”的定位(xpath也好,id也好,css也好。。。),

但是如果后面我们又去定位该元素的时候,JS还没刷新好,那么其实这些元素对于我们要定义的html是不存在的,所以是定位不到的。 这也是为什么说定位元素要等页面刷新好之后。

(只是举个例子方便理解,实际百度这里不一定是这样的)

相关