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)
转载请注明出处:http://www.dlaisen.com/article/20230526/486908.html