创建新标签并管理它们 - Selenium [英] Creating New Tabs and Managing Them - Selenium
问题描述
这是我的代码:
var chromeOptions = new ChromeOptions();chromeOptions.AddArguments(无头");_driver = new OpenQA.Selenium.Chrome.ChromeDriver(chromeOptions);_driver.Navigate().GoToUrl(url);
它将打开 chromedriver.exe 的一个实例并导航到目标 URL.我需要导航到具有相同 chromedriver.exe 实例的其他 URL,并且我需要为每个 URL 设置特定的标头和 cookie.
如何使用 Selenium 和 ChromeDriver 实现目标?
就我个人而言,我会用多个浏览器实例来做这件事.它们不应该在它们之间泄漏状态,这使得启动、清理和管理变得更加容易.
但是 - 如果你必须使用标签,这样的东西会有所帮助......
这是一个简单的管理器:
类 BrowserManager{私有 IWebDriver 驱动程序;公共浏览器管理器(){//在这里做你的浏览器选项驱动程序 = 新的 ChromeDriver();driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);}公共 IWebDriver getDriver(){回程司机;}public void addTab(string url){var js = $"window.open('{url}','_blank');";((IJavaScriptExecutor)driver).ExecuteScript(js);var handles = driver.WindowHandles.ToArray();driver.SwitchTo().Window(handles[handles.Length -1]);//切换到最新标签driver.Navigate().GoToUrl(url);}public void activateTabForPartialURL(string url){var handles = driver.WindowHandles;foreach(句柄中的var句柄){driver.SwitchTo().Window(handle);如果 (driver.Url.Contains(url))返回;}}}
这就是你如何使用它.有很多方法可以找到你想要的标签,这只是一个简单的例子
<预><代码>类 UsingTheBrowserManager{[测试]公共无效 usingIt(){字符串 google = "https://www.google.com";string stackoverflow = "https://stackoverflow.com";var browserManager = new BrowserManager();var driver = browserManager.getDriver();//创建所有驱动程序:browserManager.addTab(google);browserManager.addTab(stackoverflow);//做你的cookie/header工作//...//选择并制表并执行操作或获取一些数据browserManager.activateTabForPartialURL(google");Debug.WriteLine(browserManager.getDriver().Title);browserManager.activateTabForPartialURL(stackoverflow");Debug.WriteLine(browserManager.getDriver().Title);}}Here is my Code:
var chromeOptions = new ChromeOptions();
chromeOptions.AddArguments("headless");
_driver = new OpenQA.Selenium.Chrome.ChromeDriver(chromeOptions);
_driver.Navigate().GoToUrl(url);
It will open an instance of chromedriver.exe and will navigate to the target URL. I need to navigate to other URLs with the same chromedriver.exe intance, and I need to set specific headers and cookies for each URL.
How to achieve something with Selenium and ChromeDriver?
Personally, i;d do this with multiple browser instances. They shouldn't leak state between them and it makes start up, cleandown and management much easier.
However - if you must use tabs, something like this would help...
This is a simple manager:
class BrowserManager
{
private IWebDriver driver;
public BrowserManager()
{
//do your browser options here
driver = new ChromeDriver();
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
}
public IWebDriver getDriver()
{
return driver;
}
public void addTab(string url)
{
var js = $"window.open('{url}','_blank');";
((IJavaScriptExecutor)driver).ExecuteScript(js);
var handles = driver.WindowHandles.ToArray<string>();
driver.SwitchTo().Window(handles[handles.Length -1]); //switch to latest tab
driver.Navigate().GoToUrl(url);
}
public void activateTabForPartialURL(string url)
{
var handles = driver.WindowHandles;
foreach (var handle in handles)
{
driver.SwitchTo().Window(handle);
if (driver.Url.Contains(url))
return;
}
}
}
This is how you use it. Plenty more ways to find the tabs you want, this is just a quick example
class UsingTheBrowserManager
{
[Test]
public void usingIt()
{
string google = "https://www.google.com";
string stackoverflow = "https://stackoverflow.com";
var browserManager = new BrowserManager();
var driver = browserManager.getDriver();
//create all your drivers:
browserManager.addTab(google);
browserManager.addTab(stackoverflow);
//Do your cookie/header work
//...
//pick and tab and doing an action or get some data
browserManager.activateTabForPartialURL("google");
Debug.WriteLine(browserManager.getDriver().Title);
browserManager.activateTabForPartialURL("stackoverflow");
Debug.WriteLine(browserManager.getDriver().Title);
}
}
这篇关于创建新标签并管理它们 - Selenium的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!