问题 如何以正确的方式关注元素?


我在C#中使用selenium Webdriver进行webtest。但是我有一个问题,当浏览器窗口不是完整大小时,弹出窗口将在可见区域外打开一半。

问题是当我触发.Click();它没有做任何事情,因为我试图点击的链接在查看区域之外。

那么我如何专注于链接以获得点击工作?我目前正在使用以下解决方法,但我认为这不是一个好方法。

        _blogPostPage.FindElement(By.XPath(_popupLogin)).SendKeys("");
        _blogPostPage.FindElement(By.XPath(_popupLogin)).Click();

带有空格的sendkeys聚焦在链接上并且每次都使Click工作,但是没有正确的方法吗?


6123
2017-09-08 13:48


起源



答案:


我们一直在玩Selenium并且也遇到了这个问题。我不知道它是整个WebDriver,C#实现,Firefox等版本,但我们找到了一个好的解决方法:

诀窍是强迫Selenium评估 LocationOnScreenOnceScrolledIntoView 物业 RemoteWebElement class(继承自 FirefoxWebElement 和工具 IWebElement)。这会强制浏览器滚动,以便元素在视图中。

我们这样做的方法是使用扩展方法:

using OpenQA.Selenium;
using OpenQA.Selenium.Remote;

namespace Namespace
{
    public static class ExtensionMethods
    {
        public static IWebElement FindElementOnPage(this IWebDriver webDriver, By by)
        {
            RemoteWebElement element = (RemoteWebElement)webDriver.FindElement(by);
            var hack = element.LocationOnScreenOnceScrolledIntoView;
            return element;
        }
    }
}

这样我们所要做的就是改变生成的代码:

driver.FindElement(By.Id("elementId")).Click();

至:

driver.FindElementOnPage(By.Id("elementId")).Click();

希望对你有帮助!?


14
2017-09-20 12:35



很感谢,我会在星期一试试:),看起来比我的解决方案更好;) - Martin Mussmann
它就像一个魅力。感谢您的投入 - Martin Mussmann


答案:


我们一直在玩Selenium并且也遇到了这个问题。我不知道它是整个WebDriver,C#实现,Firefox等版本,但我们找到了一个好的解决方法:

诀窍是强迫Selenium评估 LocationOnScreenOnceScrolledIntoView 物业 RemoteWebElement class(继承自 FirefoxWebElement 和工具 IWebElement)。这会强制浏览器滚动,以便元素在视图中。

我们这样做的方法是使用扩展方法:

using OpenQA.Selenium;
using OpenQA.Selenium.Remote;

namespace Namespace
{
    public static class ExtensionMethods
    {
        public static IWebElement FindElementOnPage(this IWebDriver webDriver, By by)
        {
            RemoteWebElement element = (RemoteWebElement)webDriver.FindElement(by);
            var hack = element.LocationOnScreenOnceScrolledIntoView;
            return element;
        }
    }
}

这样我们所要做的就是改变生成的代码:

driver.FindElement(By.Id("elementId")).Click();

至:

driver.FindElementOnPage(By.Id("elementId")).Click();

希望对你有帮助!?


14
2017-09-20 12:35



很感谢,我会在星期一试试:),看起来比我的解决方案更好;) - Martin Mussmann
它就像一个魅力。感谢您的投入 - Martin Mussmann


而不是为空值发送密钥,而是将其发送给空间。这是键盘快捷键来选择一个复选框。

只需替换代码:

_blogPostPage.FindElement(By.XPath(_popupLogin)).SendKeys("");
_blogPostPage.FindElement(By.XPath(_popupLogin)).Click();

通过

_blogPostPage.FindElement(By.XPath(_popupLogin)).SendKeys(Keys.Space);

1
2018-06-11 08:38





driver.find_element(:id, "edit-section").send_keys " " 这个空间适合我。

我正在使用webdriver rspec与selenium-server-2.24.1并且我在使用IE8时遇到了麻烦 - 我一直在搞定 Selenium::WebDriver::Error::ElementNotVisibleError。在我添加了send_keys“”之前,它在IE9和FF中工作,但不是IE8。


0
2018-06-28 22:57