selenium切换frame selenium切换句柄
selenium 如何定位没有id的frame
添加:selenium 可以用xpath或者css来定位目标.
selenium切换frame selenium切换句柄
selenium切换frame selenium切换句柄
if(driver.Title.Contains(title)) //title是新窗口的Title
对于frame, 如果没有id, 可以用name或者其他属性来定位. 例如: //frame[@name='xxx']
如果所有属性都没有, 那就通过先定位该frame的祖辈级元素来缩减范围, 并逐步缩减到目标.例如: //div[@id='']//frame
你可以选用除了id之外的其他定位方法,例如xpath、name等
定位:xpath,id,name,css,tagname,linktext方法
selenium+python 自动化测试,下面页面中元素如何定位,我试了很多方法都不行
//Catch block1.框架搭建
from selenium import webdriver1.1 将struts2中的jar文件导入到项目中
commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar,freemarker-2.3.15.jar,ognl-2.7.3.jar
struts2-core-2.1.8.1.jar,xwork-core-2.1.6.jar
1.2 将struts.xml文件拷贝到项目的src目录下
1.3 修改web.xml文件
<-pattern>/-pattern>
2.action中方法的调用方式
2.1 自动方法调用(只能调用execute)
2.2 指定方法调用(通过设置action标签中的mod属性)
2.3 动态方法调用(在调用时,在action后加!方法名称,如:login!deletUser)
注意:
2.4 通注意:都要为action的成员变量提供get和set方法配符调用
3. action接收客户端参数的方式
3.1 直接在action中定义参数变量,并生成set和get方法
3.2 定义接收参数的类
3.3 让action实现ModelDriven接口,并实现里面的getModel方法
4.获取request,session,application的方式
4.1 用ActionContext获取,实际上获取到的都是Map对象
4.2 用ServletActionContext获取,获取到的是基于Servlet API的对象
4.3 让action实现RequestAware,SessionAware,ApplicationAware接口,并实现里面的方法
5.四种转向
5.1 action转发到页面(默认)
5.2 action重定向到页面
5.3 action转发到action
login
/login
login
5.4 action重定向到action
selenium 如何定位没有id的frame
} catch(ExceptionType1 e1){WebElemenet fif = driver.findElement(By.xpath("//div[@id='ext-gen47']/iframe"));
s.selectByValue(value);driver.switchTo().Iframe(fif).switchTo().Iframe("orderDayDataIframe");
WebElement element = driver.findElem 6. NoSuchSessionExceptionent(By.id("dayDataForm"));
试下这样行不行。
用python selenium提取网页中的所有标签中的超级链接地址
try {提取所有链接应该用循环:
这是一个非常有用的方法,这里就可以直接调用js方法来实现一些作,s = driver.find_elemeprint(.get_attribute("href"))如果get_attribute方法报错应该是没有找到a标签对象,如果确定是有的话,可能是页面加载比较慢还没加载出来,selenium默认是不会等待对象出现的,需要在找对象前加一些等待时间;另外如果页面上有iframe的话需要先切换进去才能找到里面的对象。nts_by_xpath("//a")
for in s:
怎样开始用selenium进行自动化测试
1. 已查明的异常(Checked Exceptions):编译器在编译的过程中,会检查到这些异常,并验证它们是否已被处理。如果未被处理,系统会报告编译错误。因此它们被通称为编译时异常(compile-time exceptions)。下面是一些常见的此类异常示例:想学习selenium进行自动化测试需要了解的东西有很多。
大量selenium学习资料,可以私聊我领取!
楼上已经说得很清楚了,另外,给你个网站叫做播布客,在那里面有不少selenium的免费视频可以学。再配上几本书
[零成本实现Web自动化测试-基于Seleni当WebDriver超过了执行下一步的等待时限时,Selenium中可能会产生此类异常。Selenium的各种等待通常被用于避免出现ElementNotVisibleException之类的异常。不过,即使在使用了适当的等待之后,如果元素仍然不可交互,那么TimeoutException也会被抛出。为此,我们必须通过执行手动测试,来检验元素的延时性,以便采取进一步的处理等待。um和Bromine].温素剑.扫描版.pdf
效果就更好了,关键是多练,加油~!
WebDriver到底怎么用
十、Firefox设置使用Selenium WebDriver驱动浏览器测试的过程中多多少少会遇到一些折腾人的问题,总结了一部分,做下分享。
一、隐藏元素处理(element not visible)
使用WebDriver点击界面上被隐藏的元素时,使用默认的IWebElement.Click()方法可能无法触发Click,这时的修改方案可以采用执行JS的方式来实现。
IWebElementwebElement = driver.FindElement(By.Id(elementId));
js.ExecuteScript("arguments[0].click();",webElement);
二、页面跳转后找不到元素(no such element)
页面跳转获取新页面的元素需要时间,所以需要在跳转后增加等待时间,最通用的方法是判断在某个时间内元素是否加载完成。
driver.Ma().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
三、屏蔽动画
如果网站使用了JQuery的动画效果,我们在运行测试的时候可以disable JQuery的animation,代码如下:
js.ExecuteScript("jQuery.fx.off=true");
四、不确定出现的元素处理
有的网站首次访问时会弹出广告,第二次访问则不再显示,这种情况可以自己调用WebDriver的IsElementPresent(Byby)方法进行判断
if(IsElementPresent(Byby)))
{driver.FindElement(by).Click();
}五、Cookie登录
自动化测试中,许多地方要求登录,cookie能够实现不必每次输入用户名和密码进行登录。
Cookiecookie =newCookie(name,value,domain,path,expires);
driver.Ma().Cookies.AddCookie(cookie);
说明:参数分别为Cookie的名称,内容,域,路径,过期时间。
六、上传
参考:《Selenium(C#)实现上传的两种方式》
七、带placeholder属性的输入框Clear无效(invalid element state)
自动测试时,会出现某些带有默认值的输入框Clear()方法报错,错误提示:invalid element state: Element is not currently interactable and may not be manipulated,此时需要检查下输入文本框是否带有placeholder属性,如果有则直接略过Clear方法,原因如下:
placeholder定义和用法
placeholder属性提供可描述输入字段预期值的提示信息· NumberFormatException:当程序将字符串传递给无法转换为数字的方法时,可能会产生此类异常。(hint)。
该提示会在输入字段为空时显示,并会在字段获得焦点时消失。
八、切换窗口
参考《WebDriver(C#)之窗口切换》
{driver.SwitchTo().Window(winHandle);
{break;
}}
九、Iframe元素定位
IWebElementframe. = driver.FindElement(By.XPath(".//[@id='form1']/div[1]/div[1]/iframe"));
driver.SwitchTo().Frame(frame);
WebDriver每次启动一个Firefox的实例时,会生成一个匿名的profile,并不会使用当前Firefox的profile。所以如果要访问需要通过的web服务,直接设置Firefox的是没用的,因为WebDriver启动的Firefox不会使用该profile,需要在代码里设置FirefoxProfile属性,或者直接调用默认的profile。
publicIWebDriverProxyConfig()
{FirefoxProfilefirefoxProfile =newFirefoxProfile();
firefoxProfile.SetPreference("network.proxy.","192.168.1.11");
firefoxProfile.SetPreference("network.proxy._port",8888);
firefoxProfile.SetPreference("network.proxy.no_proxies_on","");
returnnewFirefoxDriver(firefoxProfile);
}或者启动默认的profile
stringpatdr.find_element(:id=>'p') #--> errorh =@"C:UsersusernameAppDataLocalMozillaFirefoxProfilesa8xlln4m.default";
FirefoxProfileffprofile =newFirefoxProfile(path);
driver =newFirefoxDriver(ffprofile);
Python+selenium如何定位多层嵌套元素
[Selenium测试实践-基于电子商务平台].关春银等.扫描版.pdf有时候,什么定位元素的方法都试过了,还是定位不到元素,就考虑frame切换问题 driver.switchTo().frame("定位到的frame元素"); //接下来就可以在这个frame框架内定位该框架里的元素了 driver.findElement(By.name("message")).sendKeys("top"); //如果定位另一框架内元素,需返回到web页面,再进行切换 driver.switchTo()//Catch常用的判断条件: block.defaultContent(); driver.switchTo().frame("要定位的frame元素");
你需要知道的有关Selenium异常处理的都在这儿
firefoxProfile.SetPreference("network.proxy.type",1);什么是异常?
} catch(ExceptionType2 e2){顾名思义,作为程序员的一种常用术语,“异常”与任何特定的编程语言无关。它属于程序因为突然中止,而未能交付出预期输出的。通常,引发异常出现的潜在因素往往来自如下方面:
try {· Ja虚拟内存(JVM)的不足
· 请求访问的文件在目标系统中不存在
· 用户提供了无效的数据
· 在正常的通信过程中突然出现断网
Ja中的异常类型
· SQLException:程序在基于 SQL 语法执行 数据库 查询时,可能会产生此类异常。
· IOException:程序在文件上执行无效的I/O流作时,可能会产生此类异常。
· ClassNotFoundException:当JVM无法找到所需的Ja类时,可能会产生此类异常。
2. 未查明的异常(Unchecked Exceptions):这些异常是在程序的执行期间发生的逻辑错误,因此通常称为运行时异常(Runtime Exceptions)。此类异常在编译时未被检查出来,或者在整个编译过程中已被忽略。下面是一些典型的此类异常示例:
· NullPointerException:当访问具有空值的对象时,可能会产生此类异常。
· ArrayIndexOutofBound:当使用无效的索引值去访问数组时,可能会产生此类异常。
· IllegalArgumentException:当程序将不正确的参数传递给方法时,可能会产生此类异常。
· ArithmeticException:当程序执行不正确的算术运算(例如将数字除以零)时,可能会产生此类异常。
异常处理标准
通过对异常处理能力的提升,我们不仅可以保持代码的整洁,而且能够增强其可维护性、可扩展性和可阅读性。当然,不同的面向对象编程(Object-Oriented Programming,OOP)语言,具有不同的异常处理方法。以下是一些常用的Ja异常处理标准:
Try-Catch:该关键字组合可被用于捕获异常。其中,try块应当被放在开头,而catch块应被放在try块的末尾,以便捕获异常,并采取必要的行动。也就是说,我们可以在遇到异常时,创建异常类的对象,以便使用以下预定义的方法,来显示调试信息:
· printStackTrace():该函数可用于打印栈的跟踪、异常的名称、以及其他重要的异常信息。
· getMessage():此函数有助于获取针对异常的深入描述。
try
{// Code
} catch(Exception e){
// Code for Handling exception
}同时,Try-Catch块也可以用其他高级方法来处理异常,例如,我们可能希望从单个代码块中捕获多个异常,那么就可以通过在try块之后的多个catch块,去处理不同的异常。而且,我们在try块之后,使用无限数量的catch块。
try
{//Code
//Code for Handling Exception 1
//Code for Handling Exception 2
}Throw/Throws:如果程序员想显式地抛出异常,那么可以使用throw关键字,与要在运行时处理的异常对象协同使用。
public static void exceptionProgram()throws Exception{
// write your code here
} Catch(Exception b){
// Throw an Exception explicitly
throw(b); }
}如果开发者想抛出多个异常,则可以通过在方法签名的子句中使用throws关键字来抛出,并且由方法的调用者去进行异常处理。
public static void exceptionProgram()throws ExceptionType1, ExceptionType2{
// write your code here
} catch(ExceptionType1 e2){
// Code to handle exception 2
}finally:该个代码块往往是在try-catch块之后被创建的。也就是说,无论是否抛出异常,它都会被执行。
//Code
} finally {
//The finally block always executes.
}Selenium中的常见异常
WebDriverException定义了Selenium中的多种异常,我们从中选取最常见的异常予以介绍,并配上简单的针对Selenium的异常处理方案:
1. NoSuchElementException
当WebDriver无法定位所需要元素时,Selenium可能会产生此类异常。此处的NoSuchElementException是NotFoundException类的子类,它通常出现在程序使用了无效的时。
当然,此类异常可以在catch块中被捕获到,并且可以在其中执行所需的作,以继续完成自动化的测试。例如:
try { driver.findElement(By.id("form-se")).click(); } catch(NoSuchElementException e){
System.out.println(“WebDriver couldn’t locate the element”); }
2. NoSuchWindowException
该异常也是NotFoundException类的子类。如果WebDriver尝试着切换到无效的 浏览器 窗口,那么WebDriver将抛出NoSuchWindowException。因此,要实现窗口切换的好方法是,首先获取活动窗口的会话,然后在对应的窗口上执行所需的作。例如:
for(String windowHandle : driver.getWindowHandles()){
try { driver.switchTo().window(handle); } catch(NoSuchWindowException e){ System.out.println(“Exception while switching browser window”); }
}3. NoAlertPresentException
当WebDriver尝试着切换到某个不存在或无效的警报时,Selenium可能会产生此类异常。对此,我建议开发者使用显式、或适当的等待时间,来处理浏览器的各类警报。倘若仍然等不到警报的话,catch块可以捕获该异常。例如:
driver.switchTo().alert().accept(); } catch(NoSuchAlertException e){
System.out.println(“WebDriver couldn’t locate the Alert”); }
4. ElementNotVisibleException
该异常被定义为ElementNotInteractableException类的子类。当WebDriver尝试着对不可见的元素、或不可交互的元素执行各项作时,Selenium可能会产生此类异常。对此,我建议开发者在的确需要之处,让Selenium进行适当的超时等待。例如:
try { driver.findElement(By.id("form-se")).click(); } catch(ElementNotVisibleException e){
System.out.println(“WebDriver couldn’t locate the element”); }
5. ElementNotSelectableException
该异常属于InvalidElementStateException类的子类。在Selenium中,ElementNotSelectableException表明某个元素虽然存在于网页上,但是无法被WebDriver所选择。
catch块不但可以处理Selenium中的此类异常,而且可以使用相同或不同的 技术 ,重新选择相同的元素。例如:
Select dropdown = new Select(driver.findElement(By.id(“swift”))); } catch(ElementNotSelectableException e){
System.out.println("Element could not be selected")}
Selenium通过driver.quit()命令退出自动化的浏览器会话后,以及在调用某个测试方法时,会产生此类异常。当然,如果浏览器崩溃或出现断网,该异常也可能会发生。为了避免出现NoSuchSessionException,我们可以在测试套件结束时,退出浏览器,并确保用于 自动化测试 的浏览器版本的稳定性。例如:
private WebDriver driver;
@BeforeSuite
public void setUp(){ driver = new ChromeDriver(); }
@AfterSuite
public void tearDown(){ driver.quit(); }
7. StaleElementReferenceException
try { driver.findElement(By.xpath(“//[contains(@id,firstname’)]”)).sendKeys(“Aaron”);
} catch(StaleElementReferenceException e){
System.out.println("Could not interact with a desired element")}
8. TimeoutException
9. InvalidSelectorException
当使用无效的或不正确的选择器时,Selenium中会抛出此类异常。当然,类似情况也可能发生在创建XPATH时。对此,我们需要在将代码推送到主分支之前,检查测试脚本,并测试脚本的端到端流程。此外,SelectorHub和ChroPath等工具,也可以被用于验证。
10. NoSuchFrameException
NoSuchFrameException属于NotFoundException类的子类。当WebDriver尝试着切换到当前网页上无效的、或不存在的框架时,Selenium可能会产生此类异常。为此,我们需要首先确保框架的名称或id是正确的;其次,应确保框架的加载不会过于消耗时间。当然,如果在网页上加载框架的确非常耗时的话,则需要修正相应的等待处理。例如:
driver.switchTo().frame("frame_1"); } catch(NoSuchFrameException e){
System.out.println("Could not find the desired frame")
}小结
综上所述,为了适应各种场景,异常处理对于任何自动化脚本和逻辑结构都是至关重要的。请您务必在了解每个异常特征的基础上,有选择性地在自动化脚本中使用上述十种有关Selenium的常用异常处理命令。
用python写爬虫程序怎么调用工具包selenium
一、什么是Selenium
selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JaScript编写,因此可以用于任何支持JaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JaS// Code to handle exception 1cript渲染问题。
二、selenium基本使用
用python写爬虫的时候,主要用的是selenium的Webdriver,我们可以通过下面的方式先看看Selenium.Webdriver支持哪些浏览器
执行结果如下,从结果中我们也可以看出基本山支持了常见的所有浏览器:
这里要说一下比较重要的PhantomJS,PhantomJS是一个而基于WebKit的服务端JaScript API,支持Web而不需要浏览器支持,其快速、原生支持各种Web标准:Dom处理,CSS选择器,JSON等等。PhantomJS可以用用于页面自动化、网络监测、网页截屏,以及面测试
声明浏览器对象
上面我们知道了selenium支持很多的浏览器,但是如果想要声明并调用浏览器则需要:
这里只写了两个例子,当然了其他的支持的浏览器都可以通过这种方式调用
访问页面
上述代码运行后,会自动打开Chrome浏览器,并登陆百度打印百度首页的源代码,然后关闭浏览器
查找元素
单个元素查找
这里我们通过三种不同的方式去获取响应的元素,种是通过id的方式,第二个中是CSS选择器,第三种是xpath选择器,结果都是相同的。
这里列举一下常用的查找元素方法:
find_element_by_name
下面这种方式是比较通用的一种方式:这里需要记住By模块所以需要导入
from selenium import webdriverfrom selenium.webdrivermon.by import By
当然这种方法和上述的方式是通用的,browser.find_element(By.ID,"q")这里By.ID中的ID可以替换为其他几个
多个元素查找
其实多个元素和单个元素的区别,举个例子:find_elements,单个元素是find_element,其他使用上没什么区别,通过其中的一个例子演示:
from selenium import webdriver browser = webdriver.Chrome()
这样获得就是一个列表
当然上面的方式也是可以通过导入from selenium.webdrivermon.by import By 这种方式实现
lis = browser.find_elements(By.CSS_SELECTOR,'.serv-bd li')
同样的在单个元素中查找的方法在多个元素查找中同样存在:
对于获取的元素调用交互方法
from selenium import webdriverimport time
交互动作
将动作附加到动作链中串行执行
执行JaScript
获取元素属性
获取文本值
获取ID,位置,标签名
Frame
在很多网页中都此外,如果WebDriver仍然停留在上一页、或正在加载下一页,而所需的已到达了下一页时,就会因为该延迟而出现异常。为此,我们应当通过适当的等待处理 测试 ,限度地减少此类异常的发生。是有Frame标签,所以我们爬取数据的时候就涉及到切入到frame中以及切出来的问题,通过下面的例子演示
import timefrom selenium import webdriverfrom seleniummon.exceptions import NoSuchElementException
等待
当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常, 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
隐式等待
显示等待
指定一个等待条件,并且指定一个最长等待时间,会在这个时间内进行判断是否满足等待条件,如果成立就会立即返回,如果不成立,就会一直等待,直到等待你指定的最长等待时间,如果还是不满足,就会抛出异常,如果满足了就会正常返回
from selenium import webdriverfrom selenium.webdrivermon.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC
上述的例子中的条件:EC.presence_of_element_located()是确认元素是否已经出现了
浏览器的前进和后退
back()
import timefrom selenium import webdriver
cookie作
get_cookie当DOM中不再存在程序所需的元素时,Selenium将抛出StaleElementReferenceException。当然,如果DOM未能被正确加载、或WebDriver被卡在错误的页面上时,也可能会产生这种异常。对此,您可以使用catch块捕获该异常,并且使用动态的XPath、或尝试着重新刷新页面。例如:s()
选项卡管理
通过执行js命令实现新开选项卡window.open()
import timefrom selenium import webdriver
异常处理
这里只进行简单的演示,查找一个不存在的元素
from selenium import webdriverfrom seleniummon.exceptions import TimeoutException, NoSuchElementException
所有的努力都值得期许,每一份梦想都应该灌溉!
使用seleniumIDE录制脚本后,运行时总是在selectFrame卡住怎么解决?
页面控件是用的select么,如果是select,不用管下拉框的 public void select(String xpath, String value){
Select s = new Select(driver.findElement(By.xpath(xpath)));
}然后元素交互作脚本里调用select(xpath,v运行的结果可以看出程序会自动打开Chrome浏览器并打开淘宝输入ipad,然后删除,重新输入MakBook pro,并点击搜索aluforeach(stringwinHandleindriver.WindowHandles) //遍历当前打开的窗口e)就行了
如果不是select,就比较麻烦了,先点箭头,再点值;如果选了广东省,后面的框应该会自动变成广东下面的市吧,接着再选就行了。
selenium在iframe只有src怎么定位
如果一个页面是一个html元素,只有一个head,一个body,使用driver.FindElement()可以查找页面中任何一个元素。但是,页面中如果嵌入是的页面包含多个html元素,这种情况下就先要定位到元素所在的frame,然后再查找对应的元素,代码如下:selenium webdriver处理frame比较简单,这点比某些测试工具要先进一些,令人身心愉悦。
IJaScriptExecutorjs = driverasIJaScriptExecutor;以下面的html代码为例,我们看一下如何定位frame上的元素。
from selenium import webdriverfrom selenium.webdriver import ActionChainsframe.html
#f_1 {width: 10em; height: 10em; border: 1px solid #ccc; }
#f_2 {display: none}
Outside frame
part1.htm
This is part 1
switch_to方new1个TargetLocator对象,使用该对象的frame方法可以将当前识别的”主体”移动到需要定位的frame上去。
require 'selenium-webdriver'
dr = Selenium::WebDriver.for :chrome
frame_file = 'file:///'+File.expand_path(File.join(File.dirname(__FILE__),'frame.html'))
dr.nigate.to frame_file
#定位default content 上的p元素
dr.find_element(:id=>'p')
#将当前识别主体移动到id为f_1的frame上去
dr.switch_to.frame('f_1')
#点击frame上的button
button = dr.find_element(:id=>'btn')
button.click # -->a alert will popup
alert = dr.switch_to.alert
alert.accept
#此时再去定位frame外的p 元素将出现错误
#将识别的主体切换出frame
dr.switch_to.default_content
dr.find_element(:id=>'p') #--> ok
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。