如何檢查元素是否在頁面上而不使用函式 implicitlyWait?我可以使用隱式等待檢查該元素是否在頁面上:
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
if (driver.findElements(By.cssSelector(MY_CSS_SELECTOR)).size() != 0) {
//...
}
有沒有類似的解決方案?
uj5u.com熱心網友回復:
您已經在使用findElements,請注意,findElements即使傳遞的定位器在 HTMLDOM 中不可用,也不會引發任何錯誤。
如果找到,它將回傳一個 Web 元素串列。
現在findElements將嘗試POLL在DOM如果沒有發現任何東西immediately,所以這是我們使用ImplicitWait的原因。
由于您提到您不想處理 ImplicitWait,并且想要獲取 Web 元素串列,您要么必須使用 ExplicitWait
WebDriverWait wait = new WebDriverWait(driver, 30); wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("css_selector_here")));
或者
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector("css_selector_here")));
但請注意,使用explicit wait, 如果未找到元素,則您可能會得到TimeOutException。
顯式等待:
Selenium 客戶端可以為命令式程式語言使用顯式等待。它們允許您的代碼暫停程式執行或凍結執行緒,直到您通過它的條件得到解決。條件以一定的頻率被呼叫,直到等待超時。這意味著只要條件回傳一個虛假值,它就會繼續嘗試和等待。
由于顯式等待允許您等待條件發生,因此它們非常適合同步瀏覽器及其 DOM 和 WebDriver 腳本之間的狀態。
隱式等待:
還有另一種不同于顯式等待的等待型別,稱為隱式等待。通過隱式等待,WebDriver 在嘗試查找任何元素時輪詢 DOM 一段時間。當網頁上的某些元素無法立即使用并且需要一些時間來加載時,這可能很有用。
默認情況下禁用隱式等待元素出現,需要在每個會話的基礎上手動啟用。混合顯式等待和隱式等待會導致意想不到的后果,即即使元素可用或條件為真,也會等待最長的睡眠時間。
警告:不要混合隱式和顯式等待。這樣做會導致不可預測的等待時間。例如,設定 10 秒的隱式等待和 15 秒的顯式等待可能會導致 20 秒后發生超時。
隱式等待是告訴 WebDriver 在嘗試查找一個或多個元素(如果它們不是立即可用)時輪詢 DOM 一段時間。默認設定為 0,表示禁用。設定后,會在會話的生命周期內設定隱式等待。
官方檔案
uj5u.com熱心網友回復:
您需要為visibilityOfAllElementsLocatedBy()誘導WebDriverWait,您可以使用以下解決方案:
if(new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("MY_CSS_SELECTOR"))).size() != 0) {
//...
}
更新
要擺脫TimeoutException而不是if-else{}塊,您可能希望將代碼行包裝在try-catch{}塊中,如下所示:
try {
new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector("MY_CSS_SELECTOR"))).size() != 0)
//...
}
catch(Exception e) {
// Block of code to handle errors
}
PS:如果您實作WebDriverWait,則必須完全洗掉implicitlyWait()因為根據檔案:
警告:不要混合隱式和顯式等待。這樣做會導致不可預測的等待時間。例如,設定 10 秒的隱式等待和 15 秒的顯式等待可能會導致 20 秒后發生超時。
uj5u.com熱心網友回復:
如果您不想擔心在 at 處等待,您可以使用名為SeleniumBase的 Selenium Python 框架來處理所有等待。您可以使用斷言陳述句來驗證頁面上的元素。安裝pip install seleniumbase,然后運行測驗pytest。這是一個示例測驗:
from seleniumbase import BaseCase
class DemoSiteTests(BaseCase):
def test_demo_site(self):
self.open("https://seleniumbase.io/demo_page")
# Assert that the element is visible on the page
self.assert_element("tbody#tbodyId")
# Assert that the text appears within a given element
self.assert_text("Demo Page", "h1")
# Type text into a text field
self.type("#myTextInput", "This is Automated")
# Verify that a button click changes text on the page
self.assert_text("This Text is Green", "#pText")
self.click('button:contains("Click Me")')
self.assert_text("This Text is Purple", "#pText")
# Verify that a slider control updates a progress bar
self.assert_element('progress[value="50"]')
self.press_right_arrow("#myslider", times=5)
self.assert_element('progress[value="100"]')
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/409788.html
標籤:
