我很欣賞這個問題之前已經被問過很多次了,但是當你覺得你已經嘗試過所有關于堆疊溢位的解決方案時,那么是時候問一個問題了......
我收到一個StaleElementReferenceExceptionwhile 回圈遍歷表并單擊特定行中的鏈接。第一次它作業正常,就在第一次迭代完成時它會出錯。我完全理解這個錯誤想對我說什么,我只是不知道如何解決它:/
有問題的表格如下:

使用它對應的 HTML 源代碼:
<table CLASS="datadisplaytable" SUMMARY="This table displays the components of the course." WIDTH = "100%"><caption class="captiontext">Components</caption>
<tr>
<td CLASS="ntheader" scope="col" >Description</td>
<td CLASS="ntheader" scope="col" >Weight </td>
<td CLASS="ntheader" scope="col" >Grade<br />Scale</td>
<td CLASS="ntheader" scope="col" >Must<br />Pass</td>
<td CLASS="ntheader" scope="col" style="display:NONE;" >Include in<br />Midterm or Final</td>
<td CLASS="ntheader" scope="col" >Incomplete<br />Scores</td>
<td CLASS="ntheader" scope="col" >Subcomponents</td>
</tr>
<tr>
<td CLASS="ntdefault">COURSEWORK - <a href="/pls/ubano1/BYLKEGRB.P_FacDispShrmrks?term=202210&crn=50493&gcom_id=322913">Portfolio of clinical learning - 2000 words</a></td>
<td CLASS="ntdefault">70/100</td>
<td CLASS="ntdefault">0-100 PG</td>
<td CLASS="ntdefault"><SPAN class="fieldmediumtext">Yes</SPAN></td>
<td CLASS="ntdefault" style="display:NONE;" >F</td>
<td CLASS="ntdefault">12</td>
<TD CLASS="ntdefault">
None
</TD>
<tr>
<td CLASS="ntdefault">PRACTICAL - <a href="/pls/ubano1/BYLKEGRB.P_FacDispShrmrks?term=202210&crn=50493&gcom_id=322914">Online Objective Structured Clinical Examination (OSCE) - 1 hour</a></td>
<td CLASS="ntdefault">30/100</td>
<td CLASS="ntdefault">0-100 PG</td>
<td CLASS="ntdefault"><SPAN class="fieldmediumtext">Yes</SPAN></td>
<td CLASS="ntdefault" style="display:NONE;" >F</td>
<td CLASS="ntdefault">13</td>
<TD CLASS="ntdefault">
None
</TD>
</tr>
</table>
<br />
<table CLASS="plaintable" SUMMARY="This table displays the links for composite information if applicable.">
<tr>
<td CLASS="pldefault"><a href="/pls/ubano1/BYLKEGRB.P_FacDispShrcmrk?term=202210&crn=50493&rectype_ind=F">View Final Composite Grades</a></td>
</table>
有問題的代碼如下:
** 編輯 **
IWebElement dataDisplayTable = driver.FindElement(By.XPath("/html/body/div[4]/table[2]"));
List<IWebElement> dataDisplayTableRows = dataDisplayTable.FindElements(By.TagName("tr")).ToList();
foreach (IWebElement row in dataDisplayTableRows.Skip(1)) {
// Works first time round but then erros on 2nd iteration of loop
IWebElement assessmentTypeLink = row.FindElement(By.TagName("a"));
assessmentTypeLink.Click();
List<IWebElement> studentComponentListView =
GradebookCommon.getStudentComponentListView(row, driver);
foreach (IWebElement tr in studentComponentListView.Skip(2))
{
List<IWebElement> tableDataList = tr.FindElements(By.TagName("td")).ToList();
String studentId = tableDataList.ElementAt(1).Text;
if (Common.studentIdsMatch(studentIdToMatch, tableDataList, studentId))
{
driver.Manage().Window.Maximize();
IWebElement scoreColumnDiv = tableDataList.ElementAt(4);
IWebElement scoreColumnTextField = scoreColumnDiv.FindElement(By.TagName("input"));
scoreColumnTextField.SendKeys("60");
IWebElement submitBtn = driver.FindElement(By.XPath("/html/body/div[4]/form/input[8]"));
submitBtn.Click();
IWebElement selectComponentButton = driver.FindElement(By.LinkText("Select Component"));
selectComponentButton.Click();
break;
}
}
}
導致此問題的代碼行是:
IWebElement assessmentTypeLink = row.FindElement(By.TagName("a"));
我嘗試了其他幾種解決方案,但每一種都沒有給我帶來好運。其中一些解決方案如下:
下面的解決方案只是回圈 x 次然后失敗。
public static bool clickAssessmentLink(By by, IWebDriver driver)
{
bool result = false;
int attempts = 0;
while (attempts == 0)
{
try
{
driver.FindElement(by).Click();
result = true;
break;
}
catch (StaleElementReferenceException e)
{
Console.WriteLine("Caught exception.. Retrying.");
}
attempts ;
}
return result;
}
我還嘗試了以下方法(創建 WebElement 的副本):從這里開始:StaleReference
WebElement link = driver.findElement(By.TagName("a"));
link.click();
WebElement link1 = driver.findElement(By.TagName("a"));
link1.click();
我也嘗試過這里WebDriverWait的解決方案
public static void WaitAndClick(this IWebDriver driver, IWebElement webelement)
{
WebDriverWait fluentWait = new WebDriverWait(driver,TimeSpan.fromSeconds(20));
//No need to set PollingInterval, default is already 500ms
fluentWait.IgnoreExceptionTypes(typeof(NoSuchElementException));
fluentWait.Until(ExpectedConditions.ElementToBeClickable(webelement));
webelement.Click();
}
無論我轉向哪種解決方案,我都沒有進一步了解。以前有沒有其他人經歷過這樣的事情?我一定花了 15-16 多個小時試圖弄清楚這一點!
在此先感謝您,如果有更多資訊,請告訴我。
謝謝!
uj5u.com熱心網友回復:
我已經通過以下方式解決了這個問題。這是否是最佳實踐,我不太確定,但老實說,這是唯一對我有用的解決方案。我已經嘗試了其他所有方法,但都沒有運氣。
List<IWebElement> aHrefs = driver.FindElements(By.XPath("/html/body/div[4]/table[2]//a")).ToList();
List<String> links = new List<String>();
aHrefs.ForEach(link => { links.Add(link.GetAttribute("href")); });
foreach (String link in links) {
driver.Url = link;
Thread.Sleep(3000);
List<IWebElement> studentComponentListView = GradebookCommon.getStudentComponentListView(driver);
我所做的基本解釋:
獲取所有<a>標簽并將它們保存在串列中(通過 XPATH)
List<IWebElement> aHrefs = driver.FindElements(By.XPath("/html/body/div[4]/table[2]//a")).ToList();
宣告 newList<String>將保存<a hrefs>
遍歷每個<a>標簽并獲取<href>屬性并存盤在串列中
然后可以遍歷 中的每個鏈接<href>并通過打開它driver.Url = link
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/473988.html
