我对网络搜集还很陌生...
例如,这里是我的代码的一部分:
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功能:除外:否则:块,但我仍然想知道为什么相同的代码有时会工作,有时会返回同一页上的错误?
2条答案
按热度按时间9cbw7uwe1#
简而言之,Selenium处理WebElement的三种不同状态。
理想情况下,要单击任何***可单击***元素,您需要引发WebDriverWait for the element_to_be_clickable(),如下所示:
类似地,您也可以创建一个所需元素的列表,等待它们的 * 可见性 *,然后逐个单击它们,等待它们中的每一个都是 * 可单击的 *,如下所示:
bf1o4zei2#
欢迎来到Web自动化"肮脏"的一面。我们称之为"
Flaky
"测试。换句话说,它们是"* 脆弱 *"的。这也是Selenium Webdriver的主要缺点。可能有几个原因导致这种情况:1.网络不稳定:由于所有命令均通过网络发送:客户端-〉( selenium 网格:如果需要)-〉浏览器驱动程序-〉实际浏览器。任何连接问题都可能导致reason失败。
最后一点意见是,使用
sleep
不是一个好主意,实际上它与最佳实践背道而驰。相反,使用预期条件来确保元素可见并准备就绪