Objetivo final para serializar FirefoxDriver (mi pregunta aquí) = ¡hacer que WebDriver sea más rápido!.NET: serializar el objeto a un archivo de un ensamblado de un tercero (para hacer más rápido el Selenium WebDriver)
A continuación se muestra un enlace que describe cómo serializar un objeto. Pero requiere implementar desde ISerializable para el objeto que está serializando. Lo que me gustaría hacer es serializar un objeto que no definí: un objeto basado en una clase en un ensamblado de terceros (de una referencia de proyecto) que es que no implementa ISerializable. ¿Es eso posible? ¿Cómo puede hacerse esto?
http://www.switchonthecode.com/tutorials/csharp-tutorial-serialize-objects-to-a-file
Propiedad (IWebDriver = tipo de interfaz):
private IWebDriver driver;
objeto de instancia (FireFoxDriver es un tipo de clase):
driver = new FirefoxDriver(firefoxProfile);
===== ===========
3/21/2012 actualización después de la respuesta publicada
¿Por qué arrojaría un error? No le gusta esta línea:
serializedObject.DriverInstance = (FirefoxDriver)driver;
...
error:
Cannot implicitly convert type 'OpenQA.Selenium.IWebDriver' to 'OpenQA.Selenium.Firefox.FirefoxDriver'. An explicit conversion exists (are you missing a cast?)
Aquí está el código:
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);
}
Aquí están los dos Seri alizer clases I construidos:
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);
}
}
=================
3/23/2012 update # 2 - serialización fija/de-serialización, pero teniendo otro problema
Esto corrigió el código de llamada. Porque estamos eliminando el archivo * .qa cuando llamamos a WebDriver.Quit() porque es cuando elegimos cerrar el navegador. Esto también matará a nuestro controlador en caché. Entonces, si comenzamos con una nueva ventana del navegador, golpearemos el bloque catch y crearemos una nueva instancia y la guardaremos en nuestro archivo * .qa (en forma serializada).
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);
}
Sin embargo, sigue recibiendo esta excepción:
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.
La tercera línea de este bloque de código es tirar la excepción:
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();
}
========== ==========
actualización # 3 - 3/24/2012 - simplificó la instancia de FirefoxDriver al no pasar nada al constructor. Lo haré más complejo más adelante al pasar FirefoxProfile al constructor. Todavía recibo la misma excepción que la actualización n. ° 2.
Código de llamada:
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);
}
también tuvo que añadir ": base()" al constructor en mi clase de objeto serializado:
[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);
}
}
====== =======
Actualización # 4 - acaba de documentar las firmas de código auxiliar para OpenQA.Selenium.Firefox.FirefoxDriver clase
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();
}
}
Todavía estoy en el mismo problema, "bFormatter.Serialize (stream, objectToSerialize);" arroja una SerializationException. Encontraste una forma de resolverlo? – blueomega
No recuerdo ese problema exacto, pero si su objeto hereda otro objeto, los objetos ancestros deben implementar ISerializable ... Me gustaría volver a ver esto pronto y terminar lo que comencé – MacGyver