您的位置:首页 > 编程语言 > Python开发

python selenium 总结

2015-06-11 10:52 706 查看
网易QA技术博客看到Selenium2.0之WebDriver学习总结是使用J***A实现的,一边学习一边使用翻译成Python实现。

一、命令和操作

这一部分将介绍一下WebDriver的一些具体操作和命令,实际操作中,我们需要两大工具来帮助我们:FireBug和Xpath工具,这两者都是Firefox上的插件。接下来我们所讲解的都是以Firefox为基础的,且基于driver=webdriver.Firefox();创建的一个driver实例:

a) 访问一个页面

你想使用WebDriver做的事情肯定是访问一个页面,最基础的方法是调用“get”方法:
Selenium官方文档对 driver.get 的说明:
The driver.get method will navigate to a page given by theURL. WebDriver will wait until the page has fully loaded (that is,the “onload” event has fired) before returning control to your testor script. It’s worth noting that if your page uses a lot of
AJAXon load then WebDriver may not know when it has completelyloaded.
driver.get方法将浏览指定的URL页面。webdriver的保持等待状态,直至页面完全加载完成(即“onload”事件已被解雇),然后将控制返回执行后续测试或脚本。值得一提的是,但是如果你的页面存在很多的AJAX加载,此时WebDriver是无法知道是否完成加载。

driver.get("http://www google

.com");


检查此类页面是否加载完成,那么我们就需要Explicit和ImplicitWait(这两个将在后面文章解释)

在WebDriver的J***A版本中有一个driver.navigate().to("http://www
google

.com")的方法,也是等待页面所有内容加载完成在执行后续脚本。但Python的版本中driver.get已经实现了这功能。

b) 定位UI元素

WebDriver可以通过WebDriver实例来定位元素,任何语言库都含有“Find Element”和“FindElements”的方法。第一个方法返回一个WebElement或者抛出异常。后者返回所有WebElement的列表,或者空列表。

获取和定位元素我们调用“By”方法。下***体解释下“By”方法:

By ID

这是一个极为有效定位元素的方法。普遍的现状是UI工程师在实际编写页面时很少写id或者自动生产一个ID,这些都是需要避免的。对于一个页面Element来说,class比自动生产的id更好。

通过id定位元素的例子:

<input type="text" name="passwd" id="passwd-id" />


element = driver.find_element_by_id("passwd-id")


By Class Name

这里的class指的是DOM中的元素,在实际使用过程中,我们也会发现很多DOM元素含有相同的class名。

通过class name定位元素例子:


<div class="cheese">

<span>Cheddar</span>

</div>

<div class="cheese">

<span>Gouda</span>

</div>

element =driver.find_elements_by_class_name("cheese")

By Tag Name

DOM的Tag元素

用Tag name 定位元素的例子:



<iframesrc="..."></iframe>

element =driver.find_elements_by_tag_name("iframe")

By Name

例子:

<input type="text" name="passwd" id="passwd-id" />


element = driver.find_element_by_name("passwd")


By Link Text

例子:

<html>
 <body>
  <p>Are you sure you want to do this?</p>
  <a href="continue.html">Continue</a>
  <a href="cancel.html">Cancel</a>
</body>
<html>


continue_link = driver.find_element_by_link_text('Continue')
continue_link =


By Partial Link Text

根据链接的部分文字

例子:

<html> <body> <p>Are you sure you want to do 
this?</p> <a href="continue.html">Continue</a> <a 
href="cancel.html">Cancel</a> </body> <html>


driver.find_element_by_partial_link_text('Conti')


By CSS

从名字上看,这是根据CSS来定位元素。

例子:



<divid="food">

<spanclass="dairy">milk</span>

<span class="dairyaged">cheese</span>

</div>

cheese =driver.find_element_by_css_selector("#food span.dairy aged")

By XPATH

在高级的水平下,WebDriver尽可能使用浏览器的原生的XPath能力。在那些没有原生的XPath支持的浏览器,我们提供自己的实现方式。但是三个Driver有一定的区别。




<html>

<body>

<form id="loginForm">

<input name="username" type="text" />

<input name="password" type="password" />

<input name="continue" type="submit" value="Login" />

<input name="continue" type="button" value="Clear" />

</form>

</body>

<html>


第一种方法是Xpath指定绝对路径

login_form = driver.find_element_by_xpath("/html/body/form[1]")


第二种方法是Xpath指定form的第一元素(Xpath定位是从1开始的)

login_form = driver.find_element_by_xpath("//form[1]")


第三种方法是Xpath指定表单元素与属性命名编号

login_form =driver.find_element_by_xpath("//form[@id='loginForm']")


经验原则:WebDriver在使用中的XPath时,不应该期望能够对这些隐含属性相匹配。



选择某一个选项:


select= driver.find_element_by_tag_name("select")

select.deselect_all();

select.deselect_by_visible_text("Edam");

用户表单填充

例子:

遍历select标签:


select =driver.find_element_by_tag_name("select")
all_options=select.find_element_by_tag_name("option")
for option inall_options:
print "Value is:%s" % option.get_attribute("value")
option.click()

上传文件:


select =driver.find_element_by_id("upload")
filePath ="C:\test\\uploadfile\\media_ads\\test.jpg"
FileUpload.send_keys(filePath)

提交:

driver.find_element_by_id("upload").submit()


拖拽操作:


element=driver.find_element_by_name("source")
target=driver.find_element_by_name("target")
driver.dragdrop(element,target)

Windows和Frames之间的切换

一些web应用程序有许多Frames或多个Windows。WebDriver支持使用“switchTo”的方法实现的窗口之间切换。

driver.switch_to_window("windowName")


所有对driver的调用都会指向特定的窗口,但是我们怎么知道窗口的名字呢?我们可以查看javascript代码和打开他的链接:

<a href="somewhere.html" target="windowName">Click here to open a new window</a>


另外,还可以通过“windowhandle”去调用“switchTo().window()”,通过这个,我们就遍历来找到所有打开的窗口:


for handle indriver.window_handles:

driver.switch_to_window(handle);

}

Switch同样支持frame:


driver.switch_to_frame('frame_name')
driver.switch_to_frame(1)

弹出框:

从selenium2.0开始,已经支持对弹出框的获取

alert=driver.switch_to_alert()


这个方法会返回当前被打开打警告框,你可以进行统一,取消,读取提示内容,后则进入到提示,这个同样使用alerts,confirms,prompts。

Navigation:History andLocation:

之前我说过在J***A版Selenium API中还有 "navigate().to()"来进行打开网页,在WebDriver的小接口中Navigation就是其中之一,所以和get()不同的是Navigation可以进行的前进后退操作:

driver.navigate().forward();
driver.navigate().back();

那Python的Selenium API呢,虽然它没有 Navigation,但还可以进行浏览器的前进后退操作:

driver.forward()


driver.back()



现实打到的元素为html 文本:
myDynamicElement = driver.find_element_by_id("stockifm")
用于现实元素html 文本方法: txt = myDynamicElement.get_attribute('innerHTML')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: