Selenium WebDriver API常用方法解释
来源:互联网 发布:淘宝下拉菜单小图标 编辑:程序博客网 时间:2024/05/30 19:33
Selenium WebDriver API常用方法解释:
通过实施例引入selenium的webdriver API一个简单的入门方法就是这个例子,它在Google上搜索“Cheese”一词,然后将结果页面的标题输出到控制台。public class Selenium2Example { public static void main(String[] args) { WebDriver driver = new FirefoxDriver(); //创建Firefox驱动程序的新实例 //请注意,其余的代码依赖于接口,而不是实现。 driver.get("http://www.google.com"); //现在使用它来访问Google //或者,同样的事情可以像这样 // driver.navigate().to("http://www.google.com"); WebElement element = driver.findElement(By.name("q")); //通过名称 element.sendKeys("Cheese!"); //输入要搜索的 element.submit(); //现在提交表单,webdriver的将找到的元素为我们的表单 System.out.println("Page title is: " + driver.getTitle()); //检查页面 (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver d) { return d.getTitle().toLowerCase().startsWith("cheese!"); } }); // Google的搜索使用JavaScript动态呈现。 //等待页面加载,10秒后超时 System.out.println("Page title is: " + driver.getTitle()); //应该看到:“Cheese! - Google搜索” driver.quit(); //关闭浏览器 }}获取页面您可能想要使用WebDriver的第一件事是浏览到一个页面。正常的做法是通过调用“get”: driver.get("http://www.google.com");定位UI元素(WebElements)在WebDriver中定位元素可以在WebDriver实例本身或WebElement上完成。每个语言绑定都会显示“查找元素”和“查找元素”方法。前者返回与查询匹配的WebElement对象,如果找不到这样的元素,则会抛出异常。后者返回WebElements的列表,如果没有DOM元素与查询匹配,则可能为空。“查找”方法采用名为“By”的定位器或查询对象。“通过”策略如下。按ID这是定位元素最有效和最优选的方法。UI开发人员常见的陷阱是在页面上具有非唯一ID或自动生成id,都应该避免。html元素上的类比自动生成的id更合适。< div id = “coolestWidgetEvah” > ... </ div > WebElement element = driver.findElement(By.id("coolestWidgetEvah"));按类名在这种情况下,“类”是指DOM元素上的属性。通常在实际使用中有许多具有相同类名称的DOM元素,因此找到多个元素成为找到第一个元素的更实际的选择。<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div> List<WebElement> cheeses = driver.findElements(By.className("cheese"));按标签名称DOM标签元素的名称。<iframe src="..."></iframe> WebElement frame = driver.findElement(By.tagName("iframe"));按名称找到具有匹配name属性的input元素。<input name="cheese" type="text"/> WebElement cheese = driver.findElement(By.name("cheese"));通过链接文本找到具有匹配的可见文本的链接元素。<a href="http://www.google.com/search?q=cheese">cheese</a>> WebElement cheese = driver.findElement(By.linkText("cheese"));通过部分链接文本找到具有部分匹配的可见文本的链接元素<a href="http://www.google.com/search?q=cheese">search for cheese</a>> WebElement cheese = driver.findElement(By.partialLinkText("cheese"));通过CSS像名字一样,它是由css定位策略。默认情况下使用本地浏览器支持,因此请参考w3c css选择器以获取一般可用的css选择器列表。如果浏览器没有对css查询的本机支持,则使用Sizzle。IE 6,7和FF3.0目前使用Sizzle作为css查询引擎。请注意,并不是所有浏览器都是平等的,某些可能在一个版本中运行的css可能无法在另一个版本中运行<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div> WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));通过XPath在很高的级别,WebDriver尽可能使用浏览器的本机XPath功能。在那些没有本机XPath支持的浏览器上,我们提供了我们自己的实现。这可能会导致一些意外的行为,除非您知道各种XPath引擎的差异。<input type="text" name="example" /> List<WebElement> inputs = driver.findElements(By.xpath("//input"));使用JavaScript您可以执行任意JavaScript来查找元素,只要返回一个DOM元素,它将被自动转换为一个WebElement对象。jQuery已加载的页面上的简单示例:WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");查找页面上每个标签的所有输入元素: List<WebElement> labels = driver.findElements(By.tagName("label")); List<WebElement> inputs = (List<WebElement>) ((JavascriptExecutor)driver).executeScript( "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" + "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels);获取文本值人们通常希望检索元素中包含的innerText值。这将返回单个字符串值。请注意,这只会返回页面上显示的可见文本。 WebElement element = driver.findElement(By.id("elementID")); element.getText();用户输入 - 填写表单我们已经看到了如何在textarea或文本字段中输入文本,但是其他元素呢?您可以“切换”复选框的状态,您可以使用“点击”来设置选择的OPTION标签。处理SELECT标签并不太糟糕: WebElement select = driver.findElement(By.tagName("select")); List<WebElement> allOptions = select.findElements(By.tagName("option")); for (WebElement option : allOptions) { System.out.println(String.format("Value is: %s", option.getAttribute("value"))); option.click(); }这将在页面上找到第一个“SELECT”元素,依次循环遍历每个OPTION,打印出它们的值,然后依次选择它们。您将注意到,这不是处理SELECT元素最有效的方法。WebDriver的支持类包括一个名为“Select”,它提供了与这些交互的有用方法。 Select select = new Select(driver.findElement(By.tagName("select"))); select.deselectAll(); select.selectByVisibleText("Edam");这将从页面上的第一个SELECT中取消选择所有选项,然后选择带有显示文本“Edam”的OPTION。填写表单后,您可能需要提交。一种方法是找到“提交”按钮并点击它: driver.findElement(By.id("submit")).click();或者,WebDriver在每个元素上都有“提交”的方便方法。如果您在表单中的元素上调用此方法,则WebDriver会向上移动DOM,直到找到封闭表单,然后调用submit。如果元素不是一个表单,那么NoSuchElementException将抛出: element.submit();在Windows和帧之间移动某些Web应用程序有许多框架或多个窗口。WebDriver支持使用“switchTo”方法在命名窗口之间移动: driver.switchTo().window("windowName");所有调用driver现在将被解释为指向特定窗口。但是你怎么知道这个窗口的名字?看看打开它的javascript或链接:<a href="somewhere.html" target="windowName">Click here to open a new window</a>或者,您可以将“窗口句柄”传递给“switchTo()。window()”方法。知道这一点,可以遍历每个打开的窗口,如下所示: for (String handle : driver.getWindowHandles()) { driver.switchTo().window(handle); }您也可以从帧到帧(或到iframe)进行切换: driver.switchTo().frame("frameName");弹出对话框从Selenium 2.0 beta 1开始,内置支持处理弹出对话框。触发一个打开弹出窗口的操作后,您可以使用以下命令访问警报:这将返回当前打开的警报对象。使用此对象,您现在可以接受,关闭,读取其内容,甚至键入到提示。该界面在警报,确认和提示方面同样出色 Alert alert = driver.switchTo().alert();导航:历史和位置早些时候,我们使用“get”命令(driver.get("http://www.example.com")或driver.Url="http://www.example.com"C#)覆盖了导航到一个页面 。如您所见,WebDriver有许多较小的,以任务为中心的接口,导航是一项有用的任务。因为加载一个页面是一个基本的要求,所以这样做的方法存在于主WebDriver界面上,但它只是一个同义词: driver.navigate().to("http://www.example.com");重申:“ navigate().to()和” get()“做的完全一样。一个人比其他人更容易输入!“浏览”界面还显示了浏览器历史记录中向前和向后移动的功能:请注意,此功能完全取决于底层浏览器。如果您习惯了一个浏览器的另一个浏览器的行为,那么当您调用这些方法时,可能会发生意外事件。 driver.navigate().forward(); driver.navigate().back();Cookies在我们离开这些下一步之前,您可能有兴趣了解如何使用Cookie。首先,您需要位于该cookie有效的域上。如果您在开始与网站交互之前尝试预设Cookie,并且您的主页很大/需要一段时间来加载替代方法是在网站上找到较小的页面(通常404页面很小,例如http://example.com/some404page)。 driver.get("http://www.example.com"); //转到正确的域 Cookie cookie = new Cookie("key", "value"); driver.manage().addCookie(cookie); //现在设置cookie Set<Cookie> allCookies = driver.manage().getCookies(); for (Cookie loadedCookie : allCookies) { System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue())); } //现在输出当前URL driver.manage().deleteCookieNamed("CookieName"); driver.manage().deleteCookie(loadedCookie); driver.manage().deleteAllCookies(); //您可以通过3种方式删除Cookie更改用户代理Firefox驱动程序很简单: FirefoxProfile profile = new FirefoxProfile(); profile.addAdditionalPreference("general.useragent.override", "some UA string"); WebDriver driver = new FirefoxDriver(profile);拖放以下是使用Actions类执行拖放的示例。本地事件需要启用 WebElement element = driver.findElement(By.name("source")); WebElement target = driver.findElement(By.name("target")); (new Actions(driver)).dragAndDrop(element, target).perform();WebDriver:高级用法显性和隐性等待等待自动化任务执行经过一定的时间,然后继续下一步。您应该选择使用显性等待或隐性等待。警告:不要混合隐式和显式等待。这样做可能会导致不可预测的等待时间。例如,设置10秒的隐式等待和15秒的显式等待,可能会在20秒后引起超时。显式等待显式等待是您定义的代码,以等待某个条件发生,然后再继续执行代码。最糟糕的情况是Thread.sleep(),它将条件设置为等待的确切时间段。有一些方便的方法可以帮助您编写只需要等待的代码。WebDriverWait与ExpectedCondition组合是一种可以实现的方式。 WebDriver driver = new FirefoxDriver(); driver.get("http://somedomain/url_that_delays_loading"); WebElement myDynamicElement = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));在等待10秒钟之前抛出一个TimeoutException或者如果它发现该元素将返回0 -10秒。默认情况下,WebDriverWait将每500毫秒调用ExpectedCondition直到成功返回。ExpectedCondition函数类型的成功返回值是布尔值true或非空对象。预期条件自动化Web浏览器时会遇到一些常见的情况。以下列出了使用这些条件的几个例子。Java,C#和Python绑定包括convienence方法,所以你不必自己编写一个ExpectedCondition类,或为它们创建自己的实用程序包。元素可点击 - 显示和启用。该示例在功能上等同于第一个隐式等待示例。ExpectedConditions包(Java)(Python)(. NET)包含一组用于WebDriverWait的预定义条件。 WebDriverWait wait = new WebDriverWait(driver, 10); WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));隐性等待一个隐含的等待是告诉WebDriver在一段时间内轮询DOM,试图找到一个元素(如果它们不能立即可用)。默认设置为0.一旦设置,隐式等待设置为WebDriver对象实例的使用寿命。 WebDriver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("http://somedomain/url_that_delays_loading"); WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));RemoteWebDriver拍摄截图 WebDriver driver = new RemoteWebDriver( new URL("http://localhost:4444/wd/hub"), DesiredCapabilities.firefox()); driver.get("http://www.google.com"); WebDriver augmentedDriver = new Augmenter().augment(driver); File screenshot = ((TakesScreenshot)augmentedDriver). getScreenshotAs(OutputType.FILE); // RemoteWebDriver不实现TakesScreenshot类 //如果驱动程序确实有Capabilities进行截图 //然后Augmenter将添加TakesScreenshot方法到实例使用FirefoxProfile FirefoxProfile fp = new FirefoxProfile(); //在个人资料上设置一些东西... DesiredCapabilities dc = DesiredCapabilities.firefox(); dc.setCapability(FirefoxDriver.PROFILE, fp); WebDriver driver = new RemoteWebDriver(dc);使用代理最高版本为47.0.1的Firefox在配置文件中维护其代理配置。您可以在配置文件中预设代理,并使用该Firefox配置文件,也可以在随机创建的配置文件上进行设置,如以下示例所示 - 已弃用,不再与GeckoDriver配合使用。 String PROXY = "localhost:8080"; org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy(); proxy.setHttpProxy(PROXY) .setFtpProxy(PROXY) .setSslProxy(PROXY); DesiredCapabilities cap = new DesiredCapabilities(); cap.setCapability(CapabilityType.PROXY, proxy); WebDriver driver = new FirefoxDriver(cap);火狐版本48和更新- GeckoDriverFirefox在配置文件中维护其代理配置。您可以在配置文件中预设代理,并使用该Firefox配置文件,或者您可以在快照上创建的配置文件上进行设置,如以下示例所示。使用GeckoDriver,代理必须通过所需的功能传递。 String PROXY = "localhost"; int PORT = 8080; com.google.gson.JsonObject json = new com.google.gson.JsonObject(); json.addProperty("proxyType", "MANUAL"); json.addProperty("httpProxy", PROXY); json.addProperty("httpProxyPort", PORT); json.addProperty("sslProxy", PROXY); json.addProperty("sslProxyPort", PORT); DesiredCapabilities cap = new DesiredCapabilities(); cap.setCapability("proxy", json); GeckoDriverService service =new GeckoDriverService.Builder(firefoxBinary) .usingDriverExecutable(new File("path to geckodriver")) .usingAnyFreePort() .usingAnyFreePort() .build(); service.start(); driver = new FirefoxDriver(service, cap, cap); // GeckoDriver当前需要在RequiredCapabilities中设置代理服务器
阅读全文
0 0
- Selenium WebDriver API常用方法解释
- selenium webdriver 常用方法
- selenium webdriver 学习总结-Selenium API常用(四)
- selenium webdriver 学习总结-Selenium API常用(四)
- selenium webdriver 学习总结-Selenium API常用(四)
- Selenium WebDriver API
- selenium(WebDriver) API
- selenium webdriver常用操作方法
- selenium Webdriver 封装方法
- selenium webdriver定位方法
- Selenium Webdriver元素定位的八种常用方法
- Selenium Webdriver元素定位八中常用方法
- HttpClient API常用方法解释
- Appium API常用方法解释
- Selenium Webdriver常用JS操作
- webdriver-python常用api
- WebDriver常用API
- selenium webdriver 元素定位方法
- C#实现本地文本日志
- dlib 18 android编译dlib库,运行matrix_ex demo
- C++关于指针、const、引用三者的体会
- php运行原理
- vue.js阻止事件冒泡和默认事件
- Selenium WebDriver API常用方法解释
- log4j的使用
- ES6学习笔记:字符串、正则、数值、函数和数组的扩展
- 32位程序如何使用ADO访问64位Oracle数据库[转]
- Activity的启动流程源码分析
- 有符号整型加法与乘法
- 编程之久除了算法和数据结构,什么也不属于我们
- Cas单点登录原理
- Docker技术剖析--Swarm集群