第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Selenium:陳舊元素參考(調(diào)試時(shí)工作正常)

Selenium:陳舊元素參考(調(diào)試時(shí)工作正常)

C#
森林海 2021-04-30 15:08:49
我正在嘗試使用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"));


查看完整回答
反對(duì) 回復(fù) 2021-05-08
  • 3 回答
  • 0 關(guān)注
  • 189 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)