Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让Selenium WebDriver在Google地图方向面板中向下滚动_Selenium_Webdriver_Scrollbar - Fatal编程技术网

让Selenium WebDriver在Google地图方向面板中向下滚动

让Selenium WebDriver在Google地图方向面板中向下滚动,selenium,webdriver,scrollbar,Selenium,Webdriver,Scrollbar,我正试图让Selenium,特别是WebDriver v2.31,与Google地图交互。我可以点击[first]获取方向按钮输入一对地址,然后点击两个地址下的获取方向按钮。这将产生一组行驶方向。我不能做的是让Selenium滚动到“方向”面板的底部,以便查看目的地和“保存到我的地图”链接。我不知道问题是否是因为滚动条是由浏览器生成的 我能够执行雅虎搜索!并滚动至结果网页的底部;我认为这是因为网页的架构中没有其他框架或面板。尽管如此,浏览器还是生成了滚动条,而不是网页 我可以通过按住鼠标并向下拖

我正试图让Selenium,特别是WebDriver v2.31,与Google地图交互。我可以点击[first]获取方向按钮输入一对地址,然后点击两个地址下的获取方向按钮。这将产生一组行驶方向。我不能做的是让Selenium滚动到“方向”面板的底部,以便查看目的地和“保存到我的地图”链接。我不知道问题是否是因为滚动条是由浏览器生成的

我能够执行雅虎搜索!并滚动至结果网页的底部;我认为这是因为网页的架构中没有其他框架或面板。尽管如此,浏览器还是生成了滚动条,而不是网页

我可以通过按住鼠标并向下拖动滚动条来创建一个动作。我不喜欢这种解决方案,因为如果页面大小不同或面板大小不同,将导致大量重新计算来执行此操作。我更喜欢一个解决方案,类似于单一的“文件”窗口在雅虎!或者谷歌代码

任何帮助都将不胜感激。在过去的三天里,我一直在互联网上绞尽脑汁寻找解决方案

谢谢

史蒂夫

增编: 如下文所述。我并不是在试图对地图本身做任何事情,而是在包含方向的面板上。我之所以使用谷歌地图,是因为它类似于我稍后将要测试的应用程序。我需要能够让[Selenium]WebDriver滚动到面板底部,这样我就可以选择“下一步”链接——就像在Google Maps中滚动到方向面板底部并看到底部的保存链接一样

我不确定在使用术语面板时是否使用了正确的术语。问题在于,当显示网页时,面板似乎会动态生成滚动条

driver.switchTo().frame(driver.findElement(By.id("spsizer")));
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("javascript:window.scrollBy(250,750)", element);
driver.switchTo().defaultContent();
不幸的是,“面板”不包含在框架中或是框架中。。。如Selenium返回的异常所示:

 Exception in thread "main" org.openqa.selenium.NoSuchFrameException: Element is not a frame element: DIV
我相信我已经使用FireBug确定了面板有一个ID(“spsizer”)

这也不起作用:

element = driver.findElement(By.id("spsizer"));
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("javascript:window.scrollBy(250,750)", element);

这只是执行,没有滚动到“方向”面板的底部,但也不会引发异常。

我知道有人在GitHub上创建了一个Selenium扩展,该扩展是为自动化地图应用程序而设计的,但我不记得如何找到它。几周前我在浏览GitHub时看到了它,它通过javascript使用图像识别(我不是指Sikuli)。我认为如果你努力寻找,你所寻找的是存在的

如果您使用的是远程网格,我会避免使用Sikuli,否则它可能对您有用。另外,当涉及到iFrame时,最好在放弃自动生成框架之前尝试JavaScriptExecutor(使用switchTo框架)


在那之前,你可以先看看。此外,即使只是为了获得想法,也可能值得一看。

我可以保存我的地图链接到下面的屏幕截图中给出的以下代码

无需记录下滚动面板的步骤,Selenium可以在用户不可见的情况下定位网页中的任何web对象并对其执行操作

代码的详细信息:

第6行:命令-waitForVisible目标-//div[@id='dir\u sr']/a[@id='srlink']

我已经添加了waitForVisible,以便Selenium在链接保存到我的地图可见之前将等待5秒钟。这将为按下“获取方向”按钮后加载页面提供足够的同步时间//div[@id='dir\u sr']/a[@id='srlink']是链接保存到我的地图的XPath定位器

第7行:命令-单击目标-//div[@id='dir\u sr']/a[@id='srlink']

单击链接保存到我的地图

第8行:命令-单击目标-//按钮[@id='srsave']

单击按钮保存

C#.Net网络驱动程序代码相同。请注意,必须提供Google帐户用户名和密码才能保存地图链接

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;

namespace SeleniumTests
{
    public class GoogleMapSavingTest
    {
          static void Main(string[] args)
          {
              IWebDriver driver = new FirefoxDriver();
              driver.Navigate().GoToUrl("https://maps.google.com.au/");
              driver.FindElement(By.Id("d_launch")).Click();
              driver.FindElement(By.Id("d_d")).Clear();
              driver.FindElement(By.Id("d_d")).SendKeys("Franklin, ACT");
              driver.FindElement(By.Id("d_daddr")).Clear();
              driver.FindElement(By.Id("d_daddr")).SendKeys("Gungahlin, ACT");
              driver.FindElement(By.Id("d_d")).Click();
              driver.FindElement(By.Id("d_sub")).Click();
              for (int second = 0;; second++) 
              {
                    if (second >= 60) Assert.Fail("timeout");
                     try
                     {
                        if  (driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Displayed) break;
                    }
                    catch (Exception)
                    {}
                    Thread.Sleep(1000);
                }
             driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Click();
                driver.FindElement(By.Id("Email")).SendKeys("UserName");
                driver.FindElement(By.Id("Passwd")).SendKeys("Password");
                driver.FindElement(By.Id("signIn")).Click();
                for (int second = 0; ; second++)
                {
                    if (second >= 60) Assert.Fail("timeout");
                    try
                    {
                        if (driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Displayed) break;
                    }
                    catch (Exception)
                    { }
                    Thread.Sleep(1000);
                }
             driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Click();
            driver.FindElement(By.XPath("//button[@id='srsave']")).Click();


          }





}

}

感谢您的指导,但我不想让地图功能自动化。我试图让Selenium WebDriver确认面板中由浏览器生成的滚动条,就像Selenium在普通(无面板或框架)网页中所做的那样,该网页的查看窗口内容过多。我选择谷歌地图是因为它的易访问性和受欢迎程度,我本可以找到另一个没有地图但仍然有显示信息的面板的网站。哦,我明白了。那很容易。您需要使用driver.switchTo().frame(frameId)。最新版本的webdriver将在切换到该帧时使用findElement自动滚动(我相信)。我是否使用正确的术语将该区域称为“面板”[显示转弯驾驶方向]?还是那仍然是一个框架?我熟悉框架,但只熟悉那些不显示/隐藏的框架。你能告诉我在谷歌地图页面的哪里可以找到frameId吗?在过去的两天里,我一直在寻找不同的ID。再次感谢。我知道Firebug HTML选项卡将显示iframe的位置(显然id为“vp”)。“panel”一词与JavaFX或Swing(我认为)相关,但如果有人决定将一个组件命名为“panel”,那么它也可能与网页元素相关。谷歌地图是iframe的一个更难的例子,所以如果你不能理解它,试着用iframe中的滑块编写你自己的HTML页面作为例子来尝试。谢谢你的建议,但我没有使用Seleniu