selenium2.0b3 IE WebDriver,点击不发射
当IE9使用IE驱动时,偶尔Click方法只会select一个button,不会执行Click()的操作。 注意这只是偶尔发生,所以我不认为这是代码是问题。 在Firefox4中使用Firefox驱动程序没有问题。 我也有一个问题,元素偶尔也没有find,但只在IE浏览器,而不是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(); }
我见过这个类似的问题(http://stackoverflow.com/questions/4737205/selenium-webdriver-ie-button-issue),但我没有dynamic生成的id。
尝试使用.Click()
单击链接时,我在Internet Explorer 8上发现了同样的事情 – 尽pipe我可以看到Selenium单击链接。 从我的经验看来,如果浏览器没有焦点,那么最初的点击不起作用。
解决方法是将.Click()
发送到页面上的另一个元素,以便浏览器获得焦点,然后尝试点击链接,例如它是父级:
Driver.FindElement(By.Id("Logout")).FindElement(By.XPath("..")).Click(); Driver.FindElement(By.Id("Logout")).Click();
我发现IE驱动程序越野车和相同版本的我的代码在不同的机器上有相同版本的IE。
为了在每个行动之前保持一致,我做了以下工作。
driver.SwitchTo().Window(driver.CurrentWindowHandle);//Force Focus
对我来说,这使得IE驱动程序的行为更像预期的那样。
得到了同样的问题,点击不起作用,我的IE浏览器。 我发现一个解决方法,我做一个Driver.FindElement(By.Name(“…”))。sendKeys(“\ n”)执行点击(基本上我只是按下button进入)。 不是很干净,但它的工作,直到问题解决!
我已经重构了我的解决scheme,基于在我的项目中引用Selenium WebDriver 2.15.0,并使用Selenium WebDriver Server 2.16.0,并提出了以下意见:
- 使用
FirefoxDriver
时,点击事件确实会触发 - 对于
DesiredCapabilities.Firefox
使用RemoteWebDriver
时,某些控件的click事件不会正确RemoteWebDriver
- 使用
RemoteWebDriver
作为DesiredCapabilities.HtmlUnit
和DesiredCapabilities.HtmlUnitWithJavaScript
时,click事件会正确RemoteWebDriver
-
InternetExplorerDriver
和与DesiredCapabilities.InternetExplorer
(真的是一样的东西)的RemoteWebDriver
仍然给我不一致的结果,我很难find。
我对前三点的解决scheme是创build我自己的扩展RemoteWebDriver
和RemoteWebElement
的类,以便能够继续引用IRemoteWebDriver
和IWebElement
的testing代码中隐藏自定义行为。
我有我目前的“调整”下面,但如果你去这些自定义类,你将能够调整你的驱动程序和Web元素行为到你的心脏的内容,而无需改变你的testing代码。
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(); } }
上述解决scheme都不适合我。 这是做的伎俩:
Java的
element.sendKeys(org.openqa.selenium.Keys.CONTROL); element.click();
Groovy的
element << org.openqa.selenium.Keys.CONTROL element.click()
创业板
或者,如果您使用Geb ,那么更好的解决scheme是完全不引人注目的:
(用IE7和Geb 0.7.0testing)
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() { ... } }
在我的情况下,IE7的点击在animation模态覆盖(我们使用jQuery Tools Overlay Modal Dialog )closures之前似乎失败了。 上面的Geb方法解决了这个问题。
尝试将Internet选项 – >安全 – >启用保护模式 设置为所有区域的相同设置 ,请参阅http://www.mail-archive.com/watir-general@googlegroups.com/msg13482.html 。 这是来自Watir谷歌组,但在我的Selenium 2testingIEbutton点击似乎运行后更好地工作。
我正在使用IE版本:9正面临同样的问题。 以下工作在我的情况
element.sendKeys(Keys.ENTER); element.click();
绝对没有其他的事情为我工作。 有些InternetExplorerDriver click()是为我工作的,有些则不是。 然后我发现我错过了文档中的一行:浏览器的缩放级别必须设置为100%。
我敢肯定,所有其他的答案指的是缩放级别已经达到100%的情况,但是确实解决了我的问题。 所以先检查一下。
另一个:
v2.29.0
WebDriver:* Firefox 18支持。 * IEDriver支持“requireWindowFocus”所需的function。 当使用本地事件和本地事件时,IE驱动程序将要求焦点,用户交互将使用SendInput()来模拟用户交互。 请注意,这将意味着您不得在运行testing时使用运行IE的机器进行其他任何操作。
PHPUnit + facebook / php-webdriver有时函数click()不检查checkbox元素。
我的解决scheme是:
$Element = $WebDriver->findElement( WebDriverBy::id('checkbox_id') ); if(false === $Element->isSelected()) { $Element->sendKeys(WebDriverKeys::SPACE); }
经过一番search后,我发现了两件似乎对可重复testing有帮助的事情:
首先我添加了一个5秒的隐含等待时间。 不知道这是否适用于所有的FindElement函数,但我已经停止了我得到的大部分NoSuchElementException。
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;
其次我有一个注销function的麻烦,并将代码更改为:
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; }
明显的等待似乎处理隐含的等待不会捕获(我认为是因为redirect)。
我正在用2.0rc2,IE8,Java来体验这一点。 我在实现一个可以发送多个点击的解决scheme时遇到的问题是,有时候它可以工作。 在这些情况下,两次点击我的对象不会让我的testing的其余部分向前移动。 发送“Enter”按键也不适用于我们的控件。
有一个类似的问题logging了这一点,但我的对象不一定靠近“观点”。 任何更多的build议将不胜感激。
强制关注元素的更好的方法是使用Javascript。 当你的元素用id属性标记时,这是有效的。 如果不是的话,让开发者改变它。
使用你需要的任何定位器/属性来查找元素。 一旦元素被检索,检查它是否包含一个ID属性。 如果是这样,那么执行下面的代码,将强制焦点到元素:
JavascriptExecutor executor = (JavascriptExecutor) webDriver(); executor.executeScript("document.getElementById('" + element.GetAttribute("id") + "').focus()");
利用这一点,使用InternetExplorerDriver时几乎所有的错误点击问题都得到了解决。
我解决了下一个问题.click()。 我使用JS和executeScript(JS,WebElement el)而不是.click()。
例:
protected void clickForIE(WebElement element){ ((JavascriptExecutor)wd).executeScript("var tmp = arguments[0]; tmp.click()", element); }
但使用这种方法后,我们应该等待页面加载。 这就是为什么我使用下一个方法:
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"); } }
每次在clickForIE()后都必须调用pageWaitLoad()。
我的解决scheme是:
Selenium WebDriver 2.29.0(JAVA),使用FF16和IE9进行testing
在做一个findElement之前,我做了一个maxime浏览器屏幕。 它工作正常。
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(); }
我使用,作为解决方法,SendKeys与每个之前的空stringClick:
element.SendKeys(""); element.Click();
简短的回答:
如果您正在IE11中运行自动Seleniumtesting,并在触摸屏显示器(例如Windows 8 touch笔记本电脑)上打开浏览器窗口,请尝试在非触摸屏中打开浏览器窗口运行testing。
原始的.click()方法应该没有所有的代码解决方法。
答案背景:
我和QA团队的testing人员一起调查了一个类似的问题。 在尝试了大部分的代码解决scheme之后,在selenium webdriver IEbutton问题上 ,我们最终发现问题只发生在testing仪的Windows 8笔记本电脑触摸屏上的IE(版本11)上。
使用在其外部Dell监视器上运行的IE窗口运行Seleniumtesting,即使只使用标准的.click()调用,也可以使testing每次运行良好。
我们还在Magnific Popup( http://dimsemenov.com/plugins/magnific-popup/ )对话框中button的单击事件上失败。
我的假设:IE11(不知道其他版本)是如何处理触摸事件在触摸屏上的鼠标点击事件的翻译的问题。
WebdriverJS
在IE中,当您尝试执行click()操作时,URL会在状态栏上闪烁。 这意味着驱动程序正在关注元素并尝试执行click()操作。 为了完成click()动作,我在每次点击动作之前和之后使用了sleep()方法。
试试这个例子。
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();
执行点击我们可以使用任何这些,在IE上testing
element.click(); driver.actions().click(element).perform(); driver.executeScript("var tmp = arguments[0]; tmp.click()", element);