Конечная цель сериализации FirefoxDriver (мой вопрос здесь) = ускорение работы WebDriver!!
Ниже приведена ссылка, описывающая сериализацию объекта. Но для этого требуется, чтобы вы реализовали ISerializable для объекта, который вы сериализуете. Что я хотел бы сделать, так это сериализовать объект, который я не определял - объект, основанный на классе в сторонней сборке (из ссылки на проект), который не реализует ISerializable. Это возможно? Как это может быть сделано?
http://www.switchonthecode.com/tutorials/csharp-tutorial-serialize-objects-to-a-file
Свойство (IWebDriver = тип интерфейса):
private IWebDriver driver;
Экземпляр объекта (FireFoxDriver — это тип класса ):
driver = new FirefoxDriver(firefoxProfile);
================
Почему это вызывает ошибку? Ему не нравится эта строка:
serializedObject.DriverInstance = (FirefoxDriver)driver;
...
Ошибка:
Cannot implicitly convert type 'OpenQA.Selenium.IWebDriver' to 'OpenQA.Selenium.Firefox.FirefoxDriver'. An explicit conversion exists (are you missing a cast?)
Вот код:
FirefoxDriverSerialized serializedObject = new FirefoxDriverSerialized();
Serializer serializer = new Serializer();
serializedObject = serializer.DeSerializeObject(@"C:\firefoxDriver.qa");
driver = serializedObject.DriverInstance;
if (driver == null)
{
driver = new FirefoxDriver(firefoxProfile);
serializedObject.DriverInstance = (FirefoxDriverSerialized)driver;
serializer.SerializeObject(@"C:\firefoxDriver.qa", serializedObject);
}
Вот два класса Serializer, которые я построил:
public class Serializer
{
public Serializer()
{
}
public void SerializeObject(string filename, FirefoxDriverSerialized objectToSerialize)
{
Stream stream = File.Open(filename, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize);
stream.Close();
}
public FirefoxDriverSerialized DeSerializeObject(string filename)
{
FirefoxDriverSerialized objectToSerialize;
Stream stream = File.Open(filename, FileMode.Open);
BinaryFormatter bFormatter = new BinaryFormatter();
objectToSerialize = (FirefoxDriverSerialized)bFormatter.Deserialize(stream);
stream.Close();
return objectToSerialize;
}
}
[Serializable()]
public class FirefoxDriverSerialized : FirefoxDriver, ISerializable
{
private FirefoxDriver driverInstance;
public FirefoxDriver DriverInstance
{
get { return this.driverInstance; }
set { this.driverInstance = value; }
}
public FirefoxDriverSerialized()
{
}
public FirefoxDriverSerialized(SerializationInfo info, StreamingContext ctxt)
{
this.driverInstance = (FirefoxDriver)info.GetValue("DriverInstance", typeof(FirefoxDriver));
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
info.AddValue("DriverInstance", this.driverInstance);
}
}
======== =========
Исправлен код вызова. Потому что мы удаляем файл *.qa, когда вызываем WebDriver.Quit(), потому что именно тогда мы решили закрыть браузер. Это также убьет наш кешированный драйвер. Поэтому, если мы начнем с нового окна браузера, мы нажмем блок catch, создадим новый экземпляр и сохраним его в нашем файле *.qa (в сериализованной форме).
FirefoxDriverSerialized serializedObject = new FirefoxDriverSerialized();
Serializer serializer = new Serializer();
try
{
serializedObject = serializer.DeSerializeObject(@"C:\firefoxDriver.qa");
driver = serializedObject.DriverInstance;
}
catch
{
driver = new FirefoxDriver(firefoxProfile);
serializedObject = new FirefoxDriverSerialized();
serializedObject.DriverInstance = (FirefoxDriver)driver;
serializer.SerializeObject(@"C:\firefoxDriver.qa", serializedObject);
}
Однако по-прежнему возникает это исключение:
Acu.QA.Main.Test_0055_GiftCertificate_UserCheckout:
SetUp : System.Runtime.Serialization.SerializationException : Type 'OpenQA.Selenium.Firefox.FirefoxDriver' in Assembly 'WebDriver, Version=2.16.0.0, Culture=neutral, PublicKeyToken=1c2bd1631853048f' is not marked as serializable.
TearDown : System.NullReferenceException : Object reference not set to an instance of an object.
Третья строка в этом блоке кода выдает исключение:
public void SerializeObject(string filename, FirefoxDriverSerialized objectToSerialize)
{
Stream stream = File.Open(filename, FileMode.Create);
BinaryFormatter bFormatter = new BinaryFormatter();
bFormatter.Serialize(stream, objectToSerialize); // <=== this line
stream.Close();
}
====================
Код вызова:
FirefoxDriverSerialized serializedObject = new FirefoxDriverSerialized();
Serializer serializer = new Serializer();
try
{
serializedObject = serializer.DeSerializeObject(@"C:\firefoxDriver.qa");
driver = serializedObject.DriverInstance;
}
catch
{
//driver = new FirefoxDriver(firefoxProfile);
driver = new FirefoxDriver();
serializedObject.DriverInstance = (FirefoxDriver)driver;
serializer.SerializeObject(@"C:\firefoxDriver.qa", serializedObject);
}
Также пришлось добавить ": base()" в мой конструктор в моем классе сериализованных объектов:
[Serializable()]
public class FirefoxDriverSerialized : FirefoxDriver, ISerializable
{
private FirefoxDriver driverInstance;
public FirefoxDriver DriverInstance
{
get { return this.driverInstance; }
set { this.driverInstance = value; }
}
public FirefoxDriverSerialized() : base()
{
}
public FirefoxDriverSerialized(SerializationInfo info, StreamingContext ctxt)
{
this.driverInstance = (FirefoxDriver)info.GetValue("DriverInstance", typeof(FirefoxDriver));
}
public void GetObjectData(SerializationInfo info, StreamingContext ctxt)
{
info.AddValue("DriverInstance", this.driverInstance);
}
}
=============
using OpenQA.Selenium;
using OpenQA.Selenium.Remote;
using System;
namespace OpenQA.Selenium.Firefox
{
public class FirefoxDriver : RemoteWebDriver, ITakesScreenshot
{
// CLASS DATA MEMBERS
//public static readonly bool AcceptUntrustedCertificates;
//public static readonly string BinaryCapabilityName;
//public static readonly bool DefaultEnableNativeEvents;
//public static readonly int DefaultPort;
//public static readonly string ProfileCapabilityName;
// CONSTRUCTORS
//public FirefoxDriver();
//public FirefoxDriver(FirefoxProfile profile);
//public FirefoxDriver(ICapabilities capabilities);
//public FirefoxDriver(FirefoxBinary binary, FirefoxProfile profile);
//public FirefoxDriver(FirefoxBinary binary, FirefoxProfile profile, TimeSpan commandTimeout);
// PROPERTIES
protected FirefoxBinary Binary { get; }
protected FirefoxProfile Profile { get; }
// METHODS
//protected override RemoteWebElement CreateElement(string elementId);
//public Screenshot GetScreenshot();
//protected void PrepareEnvironment();
//protected override void StartClient();
//protected override void StopClient();
}
}