Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Selenium:在新窗口c上打开元素#_C#_Html_Selenium_Selenium Webdriver - Fatal编程技术网

C# Selenium:在新窗口c上打开元素#

C# Selenium:在新窗口c上打开元素#,c#,html,selenium,selenium-webdriver,C#,Html,Selenium,Selenium Webdriver,我用的是铬和硒。 我的代码假设打开一个链接,在这个链接上,它假设打开新页面上其他可点击的项目。为此,我创建了一个动作。当它k==4时,它会打开一个新窗口,执行某些操作并关闭驱动程序动作只起作用一次。当k==5时,它使用主驱动程序并关闭主驱动程序 for (int k = 4; k < 100; k++) // i do not know how many elements contain { try { Thread.Sleep(300);

我用的是铬和硒。 我的代码假设打开一个链接,在这个链接上,它假设打开新页面上其他可点击的项目。为此,我创建了一个动作。当它
k==4
时,它会打开一个新窗口,执行某些操作并关闭驱动程序<我写的代码>动作只起作用一次。当
k==5
时,它使用主驱动程序并关闭主驱动程序

for (int k = 4; k < 100; k++) // i do not know how many elements contain
{
    try
    {
        Thread.Sleep(300);
        Actions action = new Actions(secondDriver);
        IWebElement linkInbox = secondDriver.FindElement(By.XPath(element));
        action.KeyDown(Keys.Shift).Click(linkInbox).Perform();
        secondDriver.SwitchTo().Window(secondDriver.WindowHandles.Last());
    }
    catch (Exception)
    {
        Thread.Sleep(500);
    }
    Thread.Sleep(500);
    secondDriver.Close();
    secondDriver.SwitchTo().Window(secondDriver.WindowHandles.First());
}
for(int k=4;k<100;k++)//我不知道包含多少个元素
{
尝试
{
睡眠(300);
动作动作=新动作(第二驱动);
IWebElement linkInbox=secondDriver.FindElement(By.XPath(element));
action.KeyDown(Keys.Shift)。单击(linkInbox)。执行();
secondDriver.SwitchTo().Window(secondDriver.WindowHandles.Last());
}
捕获(例外)
{
睡眠(500);
}
睡眠(500);
secondDriver.Close();
secondDriver.SwitchTo().Window(secondDriver.WindowHandles.First());
}

编辑1:是否有
Ijavascriptexecutor
解决方案,而不是使用操作

我认为您只需要存储
CurrentWindowHandle
并在需要切换回时使用它。至于Shift+Click,我认为最好在单击链接之前使用JSExecutor在链接中添加一个属性
target=''u blank'

string mainWindowHandle = secondDriver.CurrentWindowHandle;
for (int k = 4; k < 100; k++) // i do not know how many elements contain
{
  try
  {
    Thread.Sleep(300);
    IWebElement linkInbox = secondDriver.FindElement(By.XPath(element));
    var script = "arguments[0].setAttribute('target','_blank');"
    ((IJavaScriptExecutor)secondDriver).ExecuteScript(script, linkInbox);
    Thread.Sleep(1000);
    linkInbox.Click();
    Thread.Sleep(1000);
    secondDriver.SwitchTo().Window(secondDriver.WindowHandles.Last());
    // do the thing here

    Thread.Sleep(500);
    secondDriver.Close();
    secondDriver.SwitchTo().Window(mainWindowHandle);
  catch (Exception)
  {
    Thread.Sleep(500);
  }
  if(secondDriver.WindowHandles.Count()>1)
  {
    secondDriver.SwitchTo().Window(secondDriver.WindowHandles.Last()).Close();
    secondDriver.SwitchTo().Window(mainWindowHandle);
  }

}
string mainWindowHandle=secondDriver.CurrentWindowHandle;
for(int k=4;k<100;k++)//我不知道包含多少个元素
{
尝试
{
睡眠(300);
IWebElement linkInbox=secondDriver.FindElement(By.XPath(element));
var script=“参数[0]。setAttribute('target','u blank');”
((IJavaScriptExecutor)secondDriver).ExecuteScript(脚本,linkInbox);
睡眠(1000);
linkInbox.Click();
睡眠(1000);
secondDriver.SwitchTo().Window(secondDriver.WindowHandles.Last());
//在这里做这件事
睡眠(500);
secondDriver.Close();
secondDriver.SwitchTo().Window(mainWindowHandle);
捕获(例外)
{
睡眠(500);
}
if(secondDriver.WindowHandles.Count()>1)
{
secondDriver.SwitchTo().Window(secondDriver.WindowHandles.Last()).Close();
secondDriver.SwitchTo().Window(mainWindowHandle);
}
}

它能打开新窗口吗?有什么错误吗?@Buaban我试过它后,它只对1个窗口有效。它给出了相同的结果,它只对1个窗口有效。你认为,我是否也应该保留第二个窗口?我已经更新了答案。我认为try中有错误,所以它在下一个循环中使用主窗口。