如何解决运行并行测试时如何使用driver.quit
我正在使用using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MDI_Child_Flicker_Example
{
static class Program
{
static DoubleBufferedForm MDI_FORM;
static DoubleBufferedPanel ToolbarWrapper;
static Page ActivePage;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//create MDI Parent Form
MDI_FORM = new DoubleBufferedForm()
{
IsMdiContainer = true,StartPosition = FormStartPosition.CenterScreen,Size = new System.Drawing.Size(1024,768)
};
//Buttons wrapper
ToolbarWrapper = new DoubleBufferedPanel()
{
Dock = DockStyle.Top,Size = new System.Drawing.Size(MDI_FORM.Width,60),BackColor = Color.Black,ForeColor = Color.AliceBlue
};
MDI_FORM.Controls.Add(ToolbarWrapper);
//finally,create pages
Page page1 = new Page(0);
page1.Windows = new List<DoubleBufferedForm>()
{
new DoubleBufferedForm()
{
Name = "Page1_Win1",StartPosition = FormStartPosition.Manual,Location = new Point(0,0),MinimumSize = new Size(600,300),FormBorderStyle = FormBorderStyle.None,MdiParent = MDI_FORM,ForeColor = Color.AliceBlue,Text = string.Empty,MinimizeBox = false,MaximizeBox = false,ControlBox = false
},new DoubleBufferedForm()
{
Name = "Page1_Win2",301),ControlBox = false
}
};
Page page2 = new Page(1);
page2.Windows = new List<DoubleBufferedForm>()
{
new DoubleBufferedForm()
{
Name = "Page1_Win1",Location = new Point(MDI_FORM.ClientSize.Width-600,MdiParent = MDI_FORM
},MdiParent = MDI_FORM
}
};
int colIndex = 0;
foreach (DoubleBufferedForm window in page1.Windows)
{
DoubleBufferedListView lw = new DoubleBufferedListView()
{
Dock = DockStyle.Fill,View = View.Details,FullRowSelect = true
};
//add 8 random cols,for example...
for (int i = 0; i < 9; i++)
lw.Columns.Add(string.Format("Column #{0}",++colIndex));
lw.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
window.Controls.Add(lw);
}
Application.Run(MDI_FORM);
}
public class Page
{
public List<DoubleBufferedForm> Windows;
public int Index;
public Button ChangeButton;
public Page(int index)
{
Index = index;
//create change button for the page
ChangeButton = new Button()
{
AutoSize = true,AutoSizeMode = AutoSizeMode.GrowAndShrink,MinimumSize = new Size(0,40),Padding = new Padding(8),Text = string.Format("Change to Page#{0}",Index),Tag = this,Location = new Point(ToolbarWrapper.Controls.Count.Equals(0) ? 0 : ToolbarWrapper.Controls[ToolbarWrapper.Controls.Count - 1].Right + 12,12),};
ToolbarWrapper.Controls.Add(ChangeButton);
//change page button handlers
ChangeButton.Click += ChangeButton_Click;
}
private void ChangeButton_Click(object sender,EventArgs e)
{
ChangePage((Button)sender);
}
}
static void ChangePage(Button button)
{
foreach (Control ctrl in ToolbarWrapper.Controls)
{
if (ctrl is Button)
{
ctrl.BackColor = ctrl.Parent.BackColor;
ctrl.ForeColor = ctrl.Parent.ForeColor;
}
}
button.BackColor = Color.DeepSkyBlue;
button.ForeColor = Color.AliceBlue;
if (ActivePage != null)
{
foreach (DoubleBufferedForm window in ActivePage.Windows)
{
window.Hide();
}
}
Page page = (Page)button.Tag;
foreach (DoubleBufferedForm window in page.Windows)
{
window.Show();
}
ActivePage = page;
}
public class DoubleBufferedForm : Form
{
public DoubleBufferedForm()
{
base.DoubleBuffered = true;
}
}
public class DoubleBufferedPanel : Panel
{
public DoubleBufferedPanel()
{
base.DoubleBuffered = true;
}
}
public class DoubleBufferedListView : ListView
{
public DoubleBufferedListView()
{
base.DoubleBuffered = true;
}
}
}
}
和Selenium并行运行4个。我的Java文件如下所示:
testNG
它可以通过一次打开4个浏览器窗口并运行测试来正常运行,但问题是它们永无止境。 public class SecondNGTest {
public static WebDriver driver;
public static ChromeOptions chromeOptions;
public static final String USERNAME = PRIVATE";
public static final String AUTOMATE_KEY = "PRIVATE";
public static final String URL = "https://" + USERNAME + ":" + AUTOMATE_KEY + "@hub-cloud.browserstack.com/wd/hub";
public static DesiredCapabilities caps;
@Test
public void executSessionOne() throws MalformedURLException{
//First session of WebDriver
caps = new DesiredCapabilities();
caps.setCapability("os","Windows");
caps.setCapability("os_version","10");
caps.setCapability("browser","Chrome");
caps.setCapability("browser_version","80.0 beta");
caps.setCapability("browserstack.local","false");
caps.setCapability("browserstack.selenium_version","3.5.2");
caps.setCapability("name","selenium test");
driver = new RemoteWebDriver(new URL(URL),caps);
chromeOptions = new ChromeOptions();
String chromeDriverPath = "resources/chromedriver.exe";
System.setProperty("webdriver.chrome.driver",chromeDriverPath);
//Goto guru99 site
driver.get("http://google.com/");
}
@Test
public void executeSessionTwo() throws MalformedURLException{
//Second session of WebDriver
caps = new DesiredCapabilities();
caps.setCapability("os",chromeDriverPath);
//Goto guru99 site
driver.get("http://youtube.com/");
}
@Test
public void executSessionThree() throws MalformedURLException{
//Third session of WebDriver
caps = new DesiredCapabilities();
caps.setCapability("os",chromeDriverPath);
//Goto guru99 site
driver.get("http://slack.com/");
}
@Test
public void executSessionFour() throws MalformedURLException{
//Third session of WebDriver
caps = new DesiredCapabilities();
caps.setCapability("os","Windows");
caps.setCapability("os_version","10");
caps.setCapability("browser","Chrome");
caps.setCapability("browser_version","80.0 beta");
caps.setCapability("browserstack.local","false");
caps.setCapability("browserstack.selenium_version","3.5.2");
caps.setCapability("name","selenium test");
driver = new RemoteWebDriver(new URL(URL),caps);
chromeOptions = new ChromeOptions();
String chromeDriverPath = "resources/chromedriver.exe";
System.setProperty("webdriver.chrome.driver",chromeDriverPath);
//Goto guru99 site
driver.get("http://yahoo.com/");
}
@AfterTest
public void browserclose (){
driver.quit();
System.out.println("TestCase : Browser was closed");
}
}
块仅被触发一次,因此其中一个窗口确实关闭,但其余窗口保持打开状态,我必须手动关闭它们。完成每个测试后,如何关闭/退出每个驱动程序?
编辑:这是我的testng.xml文件:
@AfterTest
解决方法
由于您正在一个Java类中执行并行执行,但是使用了不同的方法(例如,一个@Test注释一个方法),因此需要调用 @AfterMethod 钩子来关闭所有驱动程序(在每个方法/ @之后)。测试注释方法)。
,您可以尝试使用注释@AfterClass而不是@AfterTest杀死驱动程序。
@AfterClass
public void browserclose (){
driver.quit();
System.out.println("TestCase : Browser was closed");
}
,
您应该完全重新设计您的类。首先,在设计要并行运行的代码时避免使用静态字段。静态字段是类的属性,而不是对象的属性。因此,实例化它会在所有并行线程之间共享,因此除非同步,否则可能导致意外结果。
因此,您需要删除static
修饰符,并在@BeforeTest
中创建驱动程序对象(不在测试代码中),然后在@AfterTest
中退出驱动程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。