我無法弄清楚如何使用 selenium Webdriver 在新選項卡中打開鏈接。我在回圈中遇到陳舊的例外,因為第一次迭代后頁面不正確。所以我的想法是在新選項卡中打開鏈接,在該選項卡上執行我想做的所有操作,然后切換回舊選項卡繼續回圈,但我不太確定如何打開這些選項卡并進行管理他們。
string year = this.yearTextBox2.Text;
string semester = this.semesterTextBox2.Text;
int numCourses = (int)this.numEnrollments.Value;
int count = 0;
string URL = GetURL(year, semester, "index");
_driver.Navigate().GoToUrl(URL);
//var result = _driver.FindElement(By.XPath("//*[@id=\"uu-skip-target\"]/div[2]/div"));
var results = _driver.FindElements(By.CssSelector(".btn.btn-light.btn-block"));
// Loop through each department
foreach (var r in results)
{
// Make sure not to include the letter link
// Click on this department and get the list of all courses
r.Click();
var result2 = _driver.FindElement(By.Id("class-details"));
var results2 = result2.FindElements(By.XPath("./*[@class=\"class-info card mt-3\"]"));
var courseCount = 0;
// Loop through each course in the department
foreach (var r2 in results2)
{
// Stop the process once reached the amount of courses needed to be scraped
if (count >= numCourses)
break;
Course c = new Course();
c.year = year;
c.semester = semester;
var header = r2.FindElement(By.TagName("h3"));
if (header != null)
{
// Gets the course (CS 2420)
string courseNum = header.Text.Split('-')[0].Trim().ToUpper();
string[] depAndNum = courseNum.Split(' ');
// Separate department and number
c.department = depAndNum[0];
c.number = depAndNum[1];
// Get the course title
string text = header.Text.Split('-')[1].Trim();
c.title = text.Substring(4);
// Check if the course is a lecuture/seminar, if not then continue.
var list = result2.FindElement(By.CssSelector(".row.breadcrumb-list.list-unstyled"));
if (CourseIsLecture(list.FindElements(By.TagName("li"))))
{
c.count = courseCount;
GetCourseInformation(r2, c);
}
else
{
courseCount ;
continue;
}
}
// Increment the course count on this department page
courseCount ;
// Increment total course count
count ;
}
}
uj5u.com熱心網友回復:
您可以在按住 control 鍵的同時單擊以在新選項卡中強制打開鏈接。您可以使用相同的操作 API。
Actions action = new Actions(webDriver);
action.KeyDown(Keys.LeftControl).Click(r).KeyUp(Keys.LeftControl).Build().Perform();
但是,我相信當您回傳選項卡 0 并繼續回圈遍歷結果集合時,您可能仍然會遇到陳舊的參考例外。如果發生這種情況,您可以先檢索計數并將 foreach 回圈轉換為 while/for每次在 while/for 回圈中回圈并查找結果集合,然后使用 results[i] 進一步處理該元素。另一種選擇可能是將您的回圈包裝在重試塊中,例如使用 Polly 框架并再次查找結果集合以防參考過時并重試整個程序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/353483.html
上一篇:實體與繼承
下一篇:nlog按記錄器名稱設定全域屬性
