我在C#中编写了这段代码,但它并不适合我。
第二个网址仍在第一个标签中打开,但我切换了标签并更新了句柄。
// open first page in first tab
string firstPageUrl = "http://google.com";
driver.Navigate().GoToUrl(firstPageUrl);
// getting handle to first tab
string firstTabHandle = driver.CurrentWindowHandle;
// open new tab
Actions action = new Actions(driver);
action.SendKeys(OpenQA.Selenium.Keys.Control + "t").Build().Perform();
string secondTabHandle = driver.CurrentWindowHandle;
// open second page in second tab
driver.SwitchTo().Window(secondTabHandle);
string secondPageUrl = "http://bbc.com";
driver.Navigate().GoToUrl(secondPageUrl); // FAILED, page is opened in first tab -.-
Thread.Sleep(2000); // slow down a bit to see tab change
// swtich to first tab
action.SendKeys(OpenQA.Selenium.Keys.Control + "1").Build().Perform();
driver.SwitchTo().Window(firstTabHandle);
Thread.Sleep(1000);
action.SendKeys(OpenQA.Selenium.Keys.Control + "2").Build().Perform();
我使用的是最新的Chrome驱动程序。
有什么想法吗?
修改
这不重复。我不是在这里打开链接,我想导航到我提供的URL。此外,我按照建议使用CurrentWindowHandle
,但它对我不起作用。
答案 0 :(得分:2)
string secondTabHandle = driver.CurrentWindowHandle;
仍然会返回第一个标签,即使第二个标签覆盖了第一个标签。试试这个
string firstTabHandle = driver.getWindowHandle();
Actions action = new Actions(driver);
action.SendKeys(OpenQA.Selenium.Keys.Control + "t").Build().Perform();
// switch to the new tab
for (String handle : driver.getWindowHandles()) {
if (!handle.equals(firstTabHandle))
{
driver.switchTo().window(handle);
}
}
// close the second tab and switch back to the first tab
driver.close();
driver.switchTo().window(firstTabHandle);
答案 1 :(得分:1)
不完全确定这是否与您的问题有关(但我认为可能是这样):
我发现,使用硒,使用Thread.Sleep()
的更好方法是使用:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
其中第一个参数是您正在使用的selenium驱动程序,第二个参数是您在放弃之前要等待的时间(超时)
然后你可以打电话:
wait.Until(condition);
其中condition
是你想要等待的。有一个selenium类提供了各种有用的条件,称为ExpectedConditions
,例如:
ExpectedConditions.ElementToBeClickable(By by)
等待特定可点击元素准备点击。
事实上,我发现每当页面内容发生变化时,最好等待下一个你正在使用的元素。