项目实战——使用显式等待无法处理的情况

selenium里有三种等待方式:

    隐式等待:加载完浏览器开始调用,作用域是当前句柄的全局

dr.implicitly_wait(20)

强制等待:建议少用,非必须不用
import time
time.sleep(3) #强制等待3秒
显式等待:建议使用,但有时候作用并不大
WebDriverWait可以结合expected_conditions一起使用

写法一:

  from selenium import webdriver
  from selenium.webdriver.support import expected_conditions as EC
  from selenium.webdriver.support.ui import WebDriverWait
  self.driver = webdriver.Chrome()
  WebDriverWait(self.driver).until(EC.presence_of_element_located(loc))

 写法二:

  from selenium import webdriver
  from selenium.webdriver.support.ui import WebDriverWait
  self.driver = webdriver.Chrome()
  WebDriverWait(self.driver).until(lambda x:x.find_element(*loc))

无法使用WebDriverWait的情况:

勾选商品属性的时候,选中第一个属性,第二个属性才可点击,但是有延时,所以经常出现未选中的情况,脚本不稳定。想使用显式等待处理:WebDriverWait(dr, 5, 0.5).until(EC.element_to_be_clickable(el)),但是结果不理想。观察元素发现

下图商品属性通过is_display()方法判断的结果是可点击的,也正常展示了,所以使用显式等待无效

如下图红色框标出,发现class样式不一样,那么曲线救国,换种方法,解决问题,有更好的方法欢迎留言探讨

for i in range(1,10):
  el3 = dr.find_element(By.XPATH, '//li[@data-value="128G"]')
  r3 = re.search(r'sku-dont-choose', el3.get_attribute("class"))
  print('r3第%d次' %(i))
  print(r3)
  if (r3 is None):
    el3.click()
    break
  else:
    time.sleep(1)

 

 



posted @ 2022-04-16 10:17  小侠う  阅读(118)  评论(0编辑  收藏  举报