用python玩转selenium:3-selenium常用操作

来源:互联网 发布:中世纪2优化9拜占庭 编辑:程序博客网 时间:2024/05/21 06:24

3. 跳转

使用Webdriver做的第一件事就是跳转到一个页面,通常的做法是调用get方法:

driver.get("http://www.google.com")

WebDriver在将控制权返回给测试脚本之前,会一直等待到页面完全加载完毕,但如果页面使用了很多AJAX,WebDriver可能无法准确判断页面是否完全加载,这时的等待就不值得了,不过你可以采用waits方法来处理这类页面。

3.1 页面交互

只是能跳转到页面并不是十分有用,我们很想做的是与页面交互,或者,更精确地说是与页面里的HTML元素交互。首先,我们需要找到一个元素。WebDriver提供了很多定位元素的方法。如一个元素定义为:

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

可采用如下方法定位该元素:

element = driver.find_element_by_id("passwd-id")element = driver.find_element_by_name("passwd")element = driver.find_element_by_xpath("//input[@id='passwd-id']")

你还可以通过文本定位链接,但是请注意,文本必须完全匹配!在WebDriver里使用XPATH也要特别注意,如果有多个元素满足查询,将只有第一个满足条件的被返回。如果没有发现任何元素,将会抛出NoSuchElementException异常。

WebDriver 有一个基于对象的API,我们使用相同的接口来代表各种元素,这意味着在使用IDE的自动完成功能的时候,你或许看到很多可以调用的方法,但并不是所有的方法都可用。不过WebDriver总是尝试做正确的事情,如果你调用了一个无效的方法,将抛出异常。

当你得到了一个元素,你能做什么呢?首先,你也许想在输入框中输入一段文字:

element.send_keys("some text")

你可以通过Keys类模仿按箭头键:

element.send_keys(" and some", Keys.ARROW_DOWN)

在任意元素上都是可以调用send_keys的,这使得测试键盘快捷键成为可能。一个副作用是在输入框中输入字符将不会自动清空,相反,你输入的将会被添加在已有文本之后。不过,你可以使用clear方法很方便的清空输入框或输入区域的内容。

element.clear()

3.2 填充表单

我们已经知道如何在输入框或文本域输入字符或文本,但如何处理其他元素呢?你可以切换下拉菜单的状态,可以使用setSelected来设置选项标签为选中状态。处理SELECT标签也并不是太难:

element =driver.find_element_by_xpath("//select[@name='name']")all_options =element.find_elements_by_tag_name("option")for option in all_options:    print("Valueis: %s" % option.get_attribute("value"))    option.click()

这将定位到页面的第一个SELECT元素,然后遍历每个OPTION,打印出他们的值,并依次选中。

如你所想,这可能并不是处理SELECT元素的高效方法,不过webdriver提供了处理这种情况的有效方法——Select类,代码如下:

from selenium.webdriver.support.ui import Selectselect = Select(driver.find_element_by_name('name'))select.select_by_index(index)select.select_by_visible_text("text")select.select_by_value(value)

Webdriver同样也提供了清除所有选中状态的功能:

select = Select(driver.find_element_by_id('id'))select.deselect_all()

上面代码将清除OPTIONS的选中状态。

在测试过程中,有时可能需要列出所有默认选中状态的options,Select类提供了一个方法返回这个列表:

select =Select(driver.find_element_by_xpath("xpath"))all_selected_options = select.all_selected_options

获得所有可用的选项:

options = select.options

当你完成填充表单之后,你也许想要提交它,一个方法是找到submit按钮并点击它。

# Assume the button has the ID "submit"driver.find_element_by_id("submit").click()

或者,WebDriver针对每个元素提供了submit方法。如果你在一个form的元素上调用这个方法,WebDriver将会查询 DOM树直至发现包含它的form然后调用submit。如果元素没有在form里面,将会抛出NoSuchElementExcellent异常:

element.submit()

3.3 托和拽

用drag and drop,移动元素的位置,或移动到另外的元素上:

element = driver.find_element_by_name("source")target = driver.find_element_by_name("target")from selenium.webdriver import ActionChainsaction_chains = ActionChains(driver)action_chains.drag_and_drop(element, target)

3.4 在窗口和frame之间切换

现在的web应用程序很少是不包括frame或仅仅单一窗口的。WebDriver提供了”switch_to_window”方法来支持窗口间的移动:

driver.switch_to_window("windowName")

所有对driver的调用都将被转向到特定的窗口。但是如何知道窗口的名字呢?看看打开窗口的javascript或者链接:

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

或者,你可以把窗口句柄传给switch_to_window()方法。知道这个,就可以迭代访问每打开的窗口:

For handle in driver.window_handlers:Driver.switch_to_window(handle)

也可以在frame间切换:

Driver.switch_to_frame(“frameName”)

另外,通过用点分解路径访问subframe,也可以通过指定index来确定frame,如下:

Driver.switch_to_frame(frameName.0.child)

上面的代码将转向到frameName的第一个子frame中的名叫child的frame。

Frame操作一旦完成,还需要返回到父级frame,方法如下:

driver.switch_to_default_content()

3.5 弹出对话框

Selenium WebDriver内置了针对弹出窗口的处理方法。在打开一个弹出窗口后,可用以下方式访问alert:

Alert = driver.switch_to_alert()

这将返回当前打开的alert对象,通过这个对象,你可以接受,取消,读取它的内容或甚至在提示里输入内容。这个接口是适用于alert、confirm、prompt的。可参考API文档以获取更多信息。

3.6 导航:历史和定位

之前,我们用get方法来跳转到页面。如你所见,WebDriver提供了很多更加细粒度、精确任务的接口,其中,导航就是一个很有用的任务。

为了跳转到一个页面,你可以使用get方法:

driver.get(“http://www.example.com”)

为了在浏览器历史里向前或向后移动:

Driver.forward()Driver.back()

请注意这个功能完全依赖于底层驱动,而且调用这些方法可能产生非预期的结果。

3.7 Cookies

如果对如何使用cookies感兴趣,参考如下方法:

# Go to the correct domainDriver.get(“http://www.example.com”)# Now set the cookie. This one is valid for the entiredomainCookie = {“key”: “value”}Driver.add_cookie(cookie)# And now output all the available cookies for the currentURLdriver.get_cookies()

-------------------未完待续-下一篇:用python玩转selenium:4-定位元素-------------------

 

 

 

 

 

2 0
原创粉丝点击