我正在嘗試使用C#中的Selenium刮取一個(gè)頁面,通過單擊頁面上的“下一步”按鈕可以瀏覽多個(gè)頁面。我通常會(huì)得到一個(gè)錯(cuò)誤的消息,即有一個(gè)過時(shí)的元素引用,只有當(dāng)我在沒有斷點(diǎn)的情況下運(yùn)行它時(shí),該引用才會(huì)發(fā)生。如果我逐步執(zhí)行該程序,則效果很好。我假設(shè)Selenium無需等待就跳過了重要的內(nèi)容(即使我實(shí)現(xiàn)了wait方法)。對(duì)于代碼,這是問題的主要邏輯: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()); }}此方法首先獲取首頁上的所有項(xiàng)目,并將它們添加到foundVacancies列表中。之后,它將嘗試尋找“下一步”按鈕,如果沒有足夠的項(xiàng)目,該按鈕將不會(huì)一直存在。如果是這樣,它將嘗試單擊它,刮取頁面,然后再次單擊它,直到?jīng)]有剩余的頁面。這在調(diào)試時(shí)效果很好,但是正常運(yùn)行時(shí)有一些錯(cuò)誤。獲取頁面上所有項(xiàng)目以及發(fā)生錯(cuò)誤的位置的方法: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;}這些項(xiàng)目在<ul>HTML標(biāo)記中,并且有一個(gè)<li>孩子,我將逐個(gè)檢查這些孩子,并獲取其內(nèi)部文本。過時(shí)的元素錯(cuò)誤發(fā)生在foreach循環(huán)中。我假設(shè)Web驅(qū)動(dòng)程序沒有時(shí)間重新加載DOM,因?yàn)樗跀帱c(diǎn)時(shí)可以正常工作。但是,我確實(shí)有一種方法可以等待頁面完全加載,這就是我進(jìn)入下一頁時(shí)所使用的方法。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"));奇怪的是,有時(shí)Web驅(qū)動(dòng)程序僅在加載第一頁后立即關(guān)閉,而沒有任何錯(cuò)誤或任何結(jié)果。我花了很多時(shí)間在SO上進(jìn)行調(diào)試和搜索,但似乎找不到任何信息,因?yàn)樵谶M(jìn)行斷點(diǎn)處理時(shí),代碼工作得很好。我僅在有無無頭模式的情況下嘗試使用Chrome,但我認(rèn)為這可能不是Chrome的問題。我不知道data-jn-click是什么。我試圖只執(zhí)行JavaScript nextPage();,但是什么也沒做。
3 回答

楊魅力
TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
我沒有使用C#的經(jīng)驗(yàn),所以如果有錯(cuò),請(qǐng)不要介意。您正在使用findElements
并將其存儲(chǔ)到var listOfVacancies
。我已經(jīng)介紹了一些網(wǎng)站。你為什么不使用ReadOnlyCollection<IWebElement>
。最好將所有元素存儲(chǔ)為List并對(duì)其進(jìn)行遍歷。所以代碼變成了
ReadOnlyCollection<IWebElement> listOfVacancies = tableContainingAllVacancies.FindElements(By.XPath(".//li/article/div[1]/a"));
- 3 回答
- 0 關(guān)注
- 189 瀏覽
添加回答
舉報(bào)
0/150
提交
取消