让Selenium WebDriver在Google地图方向面板中向下滚动
我正试图让Selenium,特别是WebDriver v2.31,与Google地图交互。我可以点击[first]获取方向按钮输入一对地址,然后点击两个地址下的获取方向按钮。这将产生一组行驶方向。我不能做的是让Selenium滚动到“方向”面板的底部,以便查看目的地和“保存到我的地图”链接。我不知道问题是否是因为滚动条是由浏览器生成的 我能够执行雅虎搜索!并滚动至结果网页的底部;我认为这是因为网页的架构中没有其他框架或面板。尽管如此,浏览器还是生成了滚动条,而不是网页 我可以通过按住鼠标并向下拖动滚动条来创建一个动作。我不喜欢这种解决方案,因为如果页面大小不同或面板大小不同,将导致大量重新计算来执行此操作。我更喜欢一个解决方案,类似于单一的“文件”窗口在雅虎!或者谷歌代码 任何帮助都将不胜感激。在过去的三天里,我一直在互联网上绞尽脑汁寻找解决方案 谢谢 史蒂夫 增编: 如下文所述。我并不是在试图对地图本身做任何事情,而是在包含方向的面板上。我之所以使用谷歌地图,是因为它类似于我稍后将要测试的应用程序。我需要能够让[Selenium]WebDriver滚动到面板底部,这样我就可以选择“下一步”链接——就像在Google Maps中滚动到方向面板底部并看到底部的保存链接一样 我不确定在使用术语面板时是否使用了正确的术语。问题在于,当显示网页时,面板似乎会动态生成滚动条让Selenium WebDriver在Google地图方向面板中向下滚动,selenium,webdriver,scrollbar,Selenium,Webdriver,Scrollbar,我正试图让Selenium,特别是WebDriver v2.31,与Google地图交互。我可以点击[first]获取方向按钮输入一对地址,然后点击两个地址下的获取方向按钮。这将产生一组行驶方向。我不能做的是让Selenium滚动到“方向”面板的底部,以便查看目的地和“保存到我的地图”链接。我不知道问题是否是因为滚动条是由浏览器生成的 我能够执行雅虎搜索!并滚动至结果网页的底部;我认为这是因为网页的架构中没有其他框架或面板。尽管如此,浏览器还是生成了滚动条,而不是网页 我可以通过按住鼠标并向下拖
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