为什么同样的 selenium 代码在每次发射时的作用不同?

shstlldc  于 2023-02-08  发布在  其他
关注(0)|答案(2)|浏览(148)

我对网络搜集还很陌生...
例如,这里是我的代码的一部分:

labels = driver.find_elements(By.CLASS_NAME, 'form__item-checkbox-label.placeFinder-search__checkbox-label')
checkboxes = driver. find_elements(By.CLASS_NAME, 'form__item-checkbox-input.placeFinder-search__checkbox-input')
boxes = zip(labels,checkboxes)
time.sleep(3)
for label,checkbox in boxes:
    if checkbox.is_selected():
        label.click()

下面是另一个例子:

driver.get(product_link)
time.sleep(3)
button = driver.find_element(By.XPATH, '//*[@id="tab-panel__tab--product-pos-search"]/h2')
time.sleep(3)
button.click()

我正在浏览数百个产品,90%的时间都能正常工作,但是偶尔会出现giver错误,比如找不到元素或者无法点击等等,但是所有这些产品页面都是一样的,而且,如果我重新运行导致错误的产品代码,mosr的时间从第2或第3次我将能够刮取数据,不会得到错误回来。
为什么会发生这种情况?代码保持不变,网页保持不变..当它发生时,是什么导致了错误?我唯一想到的是互联网连接有时会隐藏在代码后面,程序无法看到它正在寻找的元素...但正如你所看到的,我已经添加了time.sleep(),但它并不总是有帮助...
这怎么能避免呢?被迫整天呆在监视器前只是为了监督和重新运行代码,这真的很烦人...我的意思是,我想我可以在try里面添加scrape功能:除外:否则:块,但我仍然想知道为什么相同的代码有时会工作,有时会返回同一页上的错误?

9cbw7uwe

9cbw7uwe1#

简而言之,Selenium处理WebElement的三种不同状态。

理想情况下,要单击任何***可单击***元素,您需要引发WebDriverWait for the element_to_be_clickable(),如下所示:

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//*[@id="tab-panel__tab--product-pos-search"]/h2"))).click()

类似地,您也可以创建一个所需元素的列表,等待它们的 * 可见性 *,然后逐个单击它们,等待它们中的每一个都是 * 可单击的 *,如下所示:

checkboxes = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, "form__item-checkbox-input.placeFinder-search__checkbox-input")))
for checkbox in checkboxes:
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((checkbox))).click()
bf1o4zei

bf1o4zei2#

欢迎来到Web自动化"肮脏"的一面。我们称之为"Flaky"测试。换句话说,它们是"* 脆弱 *"的。这也是Selenium Webdriver的主要缺点。可能有几个原因导致这种情况:
1.网络不稳定:由于所有命令均通过网络发送:客户端-〉( selenium 网格:如果需要)-〉浏览器驱动程序-〉实际浏览器。任何连接问题都可能导致reason失败。

  1. CSS动画:因为它直接执行命令,所以如果您有一些动画转换,它可能会导致失败
  2. Ajax类似的请求或动态元素改变。如果你有这样的"加载更多"或显示后的一些行动,它可能不dedect或仍然重叠
    最后一点意见是,使用sleep不是一个好主意,实际上它与最佳实践背道而驰。相反,使用预期条件来确保元素可见并准备就绪

相关问题