您可以設置隱式等待(不需要)或顯式等待。
var driver = new ChromeDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(1000));
driver.FindElement(By.XPath("your xpath")).Click();
在這種情況下,您'告訴'Selenium在搜索要查找的元素之前等待指定的超時。如果找不到該元素,您將收到Timeout錯誤。
var driver = new ChromeDriver();
driver.FindElement(By.XPath("your xpath")).Click();
在這種情況下,你告訴硒自動獲取到的元素,所以在情況下,它不會被發現,你會得到一個NoSuchElementException
,沒有超時,因爲沒有時間去等待元素是前當下。
如果我們將其擴大到明確的等待:
var driver = new ChromeDriver();
var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 1000));
wait.Until(d => d.FindElement(By.XPath("your xpath"))).Click();
在這種情況下,你告訴硒繼續尋找的元素,直到它被發現,但比指定爲最大超時不再一個參數爲WebDriverWait
。
舉個例子,在本地環境中,1分鐘加載一個頁面,在Azure上需要10分鐘(遠遠拉伸的例子),如果你要繼續顯式等待,那麼你可以設置暫停11分鐘。 這11分鐘是Selenium輪詢特定元素的最大超時時間。但是,如果您在本地環境中運行測試,並且在30秒內找到該元素,則測試將繼續執行。在這之前它不會等待最大超時完成。
在一臺服務器上創建整套服裝,我不知道哪個元素需要更多時間才能在其他服務器上顯示(因爲整套服裝在此處工作正常)。爲此,我需要在該服務器上運行我的套裝,並分析引起腳本失敗的位置,並且需要通過爲這些元素或其他位置放置一些顯式等待來處理。所以我擔心的是,我可以做些什麼,我不需要額外的努力來調試不同服務器上的腳本? – NarendraR
在我的情況下,提交一個表單後會顯示一條通知消息。我正在根據這個信息採取其他行動。因此,在本地服務器上,每件事情都很好(不斷工作),但在Azure服務器上需要更多時間來提交表單並獲取消息。所以造成問題。我已經在使用'ImplicitWait' – NarendraR
通過在所有服務器上運行修改我的腳本之後 - 我所做的是,實現了'Explicit wait',它導致失敗,並且它現在在所有服務器上都正常工作。所以我的問題再次是,我如何分析哪裏放正確的等待,因爲它導致其他服務器上的問題,我在本地服務器上做了什麼是好的? – NarendraR