亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Selenium:陳舊元素參考(調試時工作正常)

Selenium:陳舊元素參考(調試時工作正常)

C#
森林海 2021-04-30 15:08:49
我正在嘗試使用C#中的Selenium刮取一個頁面,通過單擊頁面上的“下一步”按鈕可以瀏覽多個頁面。我通常會得到一個錯誤的消息,即有一個過時的元素引用,只有當我在沒有斷點的情況下運行它時,該引用才會發生。如果我逐步執行該程序,則效果很好。我假設Selenium無需等待就跳過了重要的內容(即使我實現了wait方法)。對于代碼,這是問題的主要邏輯:foundVacancies.AddRange(FindVacanciesOnPage());const string nextBtnXPath = "//*[@id=\"ContainerResultList\"]/div/div[3]/nav/ul/li[8]/a";if (Driver.FindElements(By.XPath(nextBtnXPath)).Count != 0){    while (TryClickingNextButton(nextBtnXPath))    {        foundVacancies.AddRange(FindVacanciesOnPage());    }}此方法首先獲取首頁上的所有項目,并將它們添加到foundVacancies列表中。之后,它將嘗試尋找“下一步”按鈕,如果沒有足夠的項目,該按鈕將不會一直存在。如果是這樣,它將嘗試單擊它,刮取頁面,然后再次單擊它,直到沒有剩余的頁面。這在調試時效果很好,但是正常運行時有一些錯誤。獲取頁面上所有項目以及發生錯誤的位置的方法:private IEnumerable<string> FindVacanciesOnPage(){    var vacancies = new List<string>();    var tableContainingAllVacancies = Driver.FindElement(By.XPath("//*[@id=\"ContainerResultList\"]/div/div[2]/div/ul"));    var listOfVacancies = tableContainingAllVacancies.FindElements(By.XPath(".//li/article/div[1]/a"));    foreach (var vacancy in listOfVacancies)    {        vacancies.Add(vacancy.FindElement(By.XPath(".//h2")).Text);    }    return vacancies;}這些項目在<ul>HTML標記中,并且有一個<li>孩子,我將逐個檢查這些孩子,并獲取其內部文本。過時的元素錯誤發生在foreach循環中。我假設Web驅動程序沒有時間重新加載DOM,因為它在斷點時可以正常工作。但是,我確實有一種方法可以等待頁面完全加載,這就是我進入下一頁時所使用的方法。private bool TryClickingNextButton(string nextButtonXPath){    var nextButton = Driver.FindElement(By.XPath(nextButtonXPath));    var currentUrl = Driver.Url;    ScrollElementIntoView(nextButton);    nextButton.Click();    WaitUntilLoaded();    var newUrl = Driver.Url;    return !currentUrl.Equals(newUrl);}我正在比較新舊URL,以確定這是否是最后一頁。該WaitUntilLoaded方法如下所示:var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(30));wait.Until(x => ((IJavaScriptExecutor) Driver).ExecuteScript("return document.readyState").Equals("complete"));奇怪的是,有時Web驅動程序僅在加載第一頁后立即關閉,而沒有任何錯誤或任何結果。我花了很多時間在SO上進行調試和搜索,但似乎找不到任何信息,因為在進行斷點處理時,代碼工作得很好。我僅在有無無頭模式的情況下嘗試使用Chrome,但我認為這可能不是Chrome的問題。我不知道data-jn-click是什么。我試圖只執行JavaScript nextPage();,但是什么也沒做。
查看完整描述

3 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

我沒有使用C#的經驗,所以如果有錯,請不要介意。您正在使用findElements并將其存儲到var listOfVacancies。我已經介紹了一些網站。你為什么不使用ReadOnlyCollection<IWebElement>。最好將所有元素存儲為List并對其進行遍歷。所以代碼變成了

ReadOnlyCollection<IWebElement> listOfVacancies = tableContainingAllVacancies.FindElements(By.XPath(".//li/article/div[1]/a"));


查看完整回答
反對 回復 2021-05-08
  • 3 回答
  • 0 關注
  • 190 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號