internet-explorer-9 - google - webdriver chrome
Selenium 2.0b3 IE WebDriver, haga clic en no disparar (18)
Absolutamente ninguna de las otras cosas funcionó para mí. Algunos InternetExplorerDriver click () s me estaban funcionando, otros no. Luego descubrí que había perdido una línea en la documentación : el nivel de zoom del navegador debe establecerse en 100%.
Estoy seguro de que todas las otras respuestas se refieren a casos en los que el nivel de zoom ya está al 100%, pero sí solucionó mi caso. Entonces revisa eso primero.
Al usar el controlador IE con IE9, ocasionalmente el método Click solo seleccionará un botón, no hará la acción del Click (). Tenga en cuenta que esto solo ocurre de vez en cuando, así que no creo que sea el código el problema. Usar el controlador de Firefox con Firefox4 no tiene problemas. También estoy teniendo un problema donde los elementos no se encuentran ocasionalmente también, pero solo en IE nuevamente, no en Firefox.
if (Driver.FindElement(By.Name("username")) == null) {
//sometimes gets here in IE, never gets here in Firefox
}
Driver.FindElement(By.Name("username")).SendKeys(username);
Driver.FindElement(By.Name("surname")).SendKeys(surname);
Driver.FindElement(By.Name("firstname")).SendKeys(firstname);
string url = Driver.Url;
Driver.FindElement(By.Name("cmd")).Click();
if (Driver.Url == url) {
//if the page didnt change, click the link again
Driver.FindElement(By.Name("cmd")).Click();
}
He visto preguntas similares (http://stackoverflow.com/questions/4737205/selenium-webdriver-ie-button-issue), pero no tengo identificadores generados dinámicamente.
Después de buscar un poco más encontré dos cosas que parecen haber ayudado en las pruebas repetibles:
Primero agregué una Espera implícita de 5 segundos. No estoy seguro de si esto se aplica a todas las funciones de FindElement, pero he dejado de obtener la mayor parte de la NoSuchElementException que recibía.
OpenQA.Selenium.IE.InternetExplorerDriver driver = new OpenQA.Selenium.IE.InternetExplorerDriver();
driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 0, 5, 0));
//driver.Manage().Speed = Speed.Medium;
Segundo, estaba teniendo problemas con una función de Cerrar sesión y cambié el código a:
public LoginPageObject Logout() {
Driver.FindElement(By.LinkText("Logout")).Click();
OpenQA.Selenium.Support.UI.IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(Driver, TimeSpan.FromSeconds(5));
IWebElement element = wait.Until(driver => driver.FindElement(By.Name("username")));
LoginPageObject lpage = new LoginPageObject(Driver);
return lpage;
}
La espera explícita parece manejar lo que ImplicitlyWait no capta (creo que debido a los redireccionamientos).
Encuentro que el controlador de IE tiene errores y que la misma versión de mi código se comporta de manera diferente en diferentes máquinas con la misma versión de IE.
Para obtener consistentemente antes de cada acción, hago lo siguiente.
driver.SwitchTo().Window(driver.CurrentWindowHandle);//Force Focus
Para mí, esto hace que el controlador IE se comporte más como se esperaba.
Estoy experimentando esto con 2.0rc2, IE8, Java también. El problema que tengo con la implementación de una solución que puede enviar varios clics es que a veces funciona. En esos casos, hacer clic en mis objetos dos veces no permite que el resto de la prueba avance. El envío de la tecla "Enter" tampoco funciona en nuestros controles.
Hay un problema similar logged para esto, pero mis objetos no están necesariamente cerca del "punto de vista". Cualquier otra sugerencia sería muy apreciada.
Estoy usando la versión IE: 9 Estaba enfrentando el mismo problema. Lo siguiente funcionó en mi caso
element.sendKeys(Keys.ENTER);
element.click();
He encontrado lo mismo en Internet Explorer 8 cuando intento hacer clic en enlaces usando .Click()
, aunque puedo ver que Selenium hace clic en el enlace. Desde mi experiencia, parece que si el navegador no tiene foco, entonces el clic inicial no funciona.
Una solución a esto es enviar un .Click()
a otro elemento en la página, de modo que el navegador obtenga el foco, antes de intentar hacer clic en el enlace, por ejemplo, su padre:
Driver.FindElement(By.Id("Logout")).FindElement(By.XPath("..")).Click();
Driver.FindElement(By.Id("Logout")).Click();
Intente configurar las Opciones de Internet -> Seguridad -> Activar modo protegido en la misma configuración para todas las zonas , consulte http://www.mail-archive.com/[email protected]/msg13482.html . Esto es del grupo de google de Watir, pero en mis pruebas de Selenium 2, los clics en los botones de IE parecen funcionar mejor después de aplicar esto.
Mi solución fue:
Selenium WebDriver 2.29.0 (JAVA), PROBADO con FF16 e IE9
Antes de hacer un findElement, hice una pantalla de navegador de maxime. Funciona bien.
public void maximeBrowser() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension screenResolution = new Dimension((int)toolkit.getScreenSize().getWidth(), (int)toolkit.getScreenSize().getHeight());
//Maximize the browser
logger.info("Maximizing the browser : getWidth ["+screenResolution.getWidth()+"] - getHeight ["+screenResolution.getHeight()+"]");
getDriver().manage().window().maximize();
}
Ninguna de las soluciones anteriores funcionó para mí. Esto hizo el truco sin embargo:
Java
element.sendKeys(org.openqa.selenium.Keys.CONTROL);
element.click();
Groovy
element << org.openqa.selenium.Keys.CONTROL
element.click()
Geb
O bien, si está utilizando Geb , hay una solución aún mejor que es completamente discreta:
(probado con IE7 y Geb 0.7.0 )
abstract class BaseSpec extends geb.spock.GebSpec
{
static
{
def oldClick = geb.navigator.NonEmptyNavigator.metaClass.getMetaMethod("click")
def metaclass = new geb.navigator.AttributeAccessingMetaClass(new ExpandoMetaClass(geb.navigator.NonEmptyNavigator))
// Wrap the original click method
metaclass.click = {->
delegate << org.openqa.selenium.Keys.CONTROL
oldClick.invoke(delegate)
}
metaclass.initialize()
geb.navigator.NonEmptyNavigator.metaClass = metaclass
}
}
class ClickSpec extends BaseSpec
{
def "verify click"()
{
given:
to HomePage
expect:
waitFor { at HomePage }
when:
dialog.dismiss()
// Call the wrapped .click() method normally
$(''#someLink'').click()
then:
waitFor { at SomePage }
}
}
class HomePage extends geb.Page
{
static url = "index.html"
static at = { title == "Home - Example.com" }
static content = {
dialog { module DialogModule }
}
}
class SomePage extends geb.Page { ... }
class DialogModule extends geb.Module { def dismiss() { ... } }
En mi caso, al hacer clic en IE7 parecía fallar cada vez que estaba precedido por el cierre de una superposición modal animada (estamos usando el diálogo modal de superposición de jQuery Tools ). El método Geb anterior resolvió este problema.
Otro:
v2.29.0
WebDriver: * Compatible con Firefox 18. * IEDriver admite la capacidad deseada "requireWindowFocus". Al usar esto y eventos nativos, el controlador de IE exigirá enfoque y las interacciones del usuario utilizarán SendInput () para simular las interacciones del usuario. Tenga en cuenta que esto significará que NO DEBE utilizar la máquina que ejecuta IE para nada más a medida que se ejecutan las pruebas.
PHPUnit + facebook / php-webdriver a veces la función click () no marca el elemento de casilla de verificación.
mi solución es:
$Element = $WebDriver->findElement(
WebDriverBy::id(''checkbox_id'')
);
if(false === $Element->isSelected())
{
$Element->sendKeys(WebDriverKeys::SPACE);
}
Refactoreé mi solución basándome en la referencia de Selenium WebDriver 2.15.0 en mi proyecto y el uso de Selenium WebDriver Server 2.16.0 y he hecho las siguientes observaciones:
- El evento click se dispara correctamente cuando se usa el
FirefoxDriver
- El evento click no se
RemoteWebDriver
correctamente para ciertos controles cuando se usaRemoteWebDriver
para lasDesiredCapabilities.Firefox
- El evento click se
RemoteWebDriver
correctamente cuando se usaRemoteWebDriver
para lasDesiredCapabilities.HtmlUnit
yDesiredCapabilities.HtmlUnitWithJavaScript
- El
InternetExplorerDriver
y elRemoteWebDriver
conDesiredCapabilities.InternetExplorer
(realmente lo mismo) todavía me están dando resultados inconsistentes que me resultan difíciles de precisar.
Mi solución para los primeros tres puntos ha sido crear mis propias clases que extienden RemoteWebDriver
y RemoteWebElement
para que pueda ocultar mi comportamiento personalizado del código de prueba que sigue IRemoteWebDriver
referencia a IRemoteWebDriver
e IWebElement
.
Tengo debajo de mis "ajustes" actuales, pero si opta por estas clases personalizadas, podrá ajustar el comportamiento de su controlador y elemento web al contenido de su corazón sin tener que cambiar el código de prueba.
public class MyRemoteWebDriver : RemoteWebDriver
{
//Constructors...
protected override RemoteWebElement CreateElement(string elementId)
{
return new MyWebElement(this, elementId);
}
}
public class MyWebElement : RemoteWebElement, IWebElement
{
//Constructor...
void IWebElement.Click()
{
if (Settings.Default.WebDriver.StartsWith("HtmlUnit"))
{
Click();
return;
}
if (TagName == "a")
{
SendKeys("/n");
Thread.Sleep(100);
return;
}
if (TagName == "input")
{
switch (GetAttribute("type"))
{
case "submit":
case "image":
Submit();
return;
case "checkbox":
case "radio":
//Send the ''spacebar'' keystroke
SendKeys(" ");
return;
}
}
//If no special conditions are detected, just run the normal click
Click();
}
}
Resolví el problema con .click () al lado. Usé JS y executeScript (JS, WebElement el) en lugar de .click ().
Ejemplo:
protected void clickForIE(WebElement element){
((JavascriptExecutor)wd).executeScript("var tmp = arguments[0];
tmp.click()", element);
}
Pero después de usar este método debemos esperar mientras carga la página. Y es por eso que utilicé el próximo método:
protected synchronized void pageWaitLoad() {
String str = null;
try {
str = (String)((JavascriptExecutor)wd).executeScript("return document.readyState");
}
catch (Exception e) {
// it''s need when JS isn''t worked
pageWaitLoad();
return;
}
System.out.println("ttt " + str);
while(!str.equals("complete")){
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
str = (String)((JavascriptExecutor)wd).executeScript("return document.readyState");
}
}
Debe llamar a pageWaitLoad () cada vez después de hacer clic en ForFie ().
Respuesta corta:
Si está ejecutando una prueba automática de Selenium en IE11 con la ventana del navegador abierta en un monitor de pantalla táctil (por ejemplo, la computadora portátil con pantalla táctil de Windows 8), intente ejecutar la prueba con la ventana del navegador abierta en una pantalla no táctil .
El método .click () original debería funcionar bien sin todas las soluciones provisionales del código.
Respuesta de fondo:
Trabajé con un probador en nuestro equipo de control de calidad para investigar un problema similar. Después de probar la mayoría de las soluciones de código aquí y en el problema del botón IE del selenium webdriver , finalmente descubrimos que el problema solo ocurrió en IE (versión 11 para nosotros) en la pantalla táctil del ordenador portátil Windows 8 del probador.
Ejecutar la prueba Selenium con la ventana IE ejecutándose en su monitor Dell externo permitió que la prueba funcionara bien todas las veces, incluso utilizando solo la llamada estándar .click ().
También fallamos en el evento de clic para un botón en un cuadro de diálogo Magnific Popup ( http://dimsemenov.com/plugins/magnific-popup/ ).
Mi hipótesis: hay un problema con la forma en que IE11 (no estoy seguro acerca de otras versiones) maneja la traducción de eventos táctiles a / desde eventos de clic del mouse en pantallas táctiles.
Tengo el mismo problema, el clic no funciona con mi IE. Encontré una solución donde hago un Driver.FindElement (By.Name ("...")). SendKeys ("/ n") para realizar el clic (básicamente, solo presiono enter en el botón). ¡No muy limpio, pero funciona hasta que se resuelva el problema!
Una mejor manera de forzar el enfoque en el elemento es usar Javascript. Esto funciona cuando tus elementos están etiquetados con el atributo id. Si no lo son, consigue que los desarrolladores lo cambien.
Encuentra el elemento usando el localizador / propiedades que necesites. Una vez que se recupera el elemento, verifique si contiene un atributo de ID. Si lo hace, ejecute el siguiente código que forzará el enfoque al elemento:
JavascriptExecutor executor = (JavascriptExecutor) webDriver();
executor.executeScript("document.getElementById(''" + element.GetAttribute("id") + "'').focus()");
Al usar esto, casi todos los problemas con clics perdidos se resolvieron al usar InternetExplorerDriver.
Utilicé, como solución, SendKeys con una cadena vacía antes de cada clic:
element.SendKeys("");
element.Click();
En IE cuando intenta realizar una acción de clic (), la URL permanece parpadeando en la barra de estado. Significa que el controlador se está enfocando en el elemento y tratando de realizar una acción de clic (). Para completar su acción click (), utilicé el método sleep () antes y después de cada acción de clic.
Prueba este ejemplo.
var webdriver = require(''..''), By = webdriver.By, until = webdriver.until;
var driver = new webdriver.Builder().usingServer().withCapabilities({''browserName'': ''ie'' }).build();
driver.get(''http://www.google.com'')
.then(function(){
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(1000 * 3);
driver.findElement(By.name(''q'')).sendKeys(''webdriver'');
driver.findElement(By.name(''btnG'')).then(function(button){
button.click();
});
})
.then(function(){
driver.findElement(By.css(''div[class="gb_Zb"] a[title="Google Apps"]'')).then(function(apps){
apps.click();
driver.findElements(By.css(''a[class="gb_O"]'')).then(function(appsList){
console.log("apps : "+appsList.length);
for(var i = 0; i < appsList.length; i++){
console.log(''applications : ''+i);
if(i == 5) {
var element = appsList[i];
driver.sleep(1000 * 5);
driver.executeScript("var tmp = arguments[0]; tmp.click()", element);
driver.sleep(1000 * 5);
} } })
})
})
.then(null, function(err) {
console.error("An error was thrown! By Promise... " + err);
});
driver.quit();
para hacer clic podemos usar cualquiera de estos, probado en IE
element.click();
driver.actions().click(element).perform();
driver.executeScript("var tmp = arguments[0]; tmp.click()", element);