Selenium with Python中文翻译(三)

3.浏览网页
你想用WebDriver做的第一件事情应该是浏览一个网页。普遍的方法是调用get方法:

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

WebDriver会等待整个网页加载完毕,才会把控制权交还给你所编写的测试和脚本。值得注意的是如果你想要浏览的网页在加载时充满了大量的AJAX,或许WebDriver并不知道什么时候才算是加载完毕。如果你想确定网页加载完毕你可以用waits
3.1.与页面进行交互
仅仅浏览网页或许并不是那么有用。我们真正想要做的是与页面进行交互更确切的说是与网页中的HTML元素进行交互。首先,我们需要找到HTML元素。WebDriver提供了很多方法来寻找HTML元素。例如,先给出一个以下面的方式定义的元素:

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

你可以用很多种方法来寻找它:

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

你或许想要通过文本来查找链接,但是在调用查找方法时要小心。所要找的文本必须要完全匹配。当你在WebDriver中使用XPATH时也要小心。如果不止一个元素被匹配到,那么它只会返回匹配到的第一个元素。如果什么都没有找到

NoSuchElementException

便会被引发。
WebDriver有一个“基于对象”API。我们使用相同的界面表示所有的元素。这意味着虽然看起来有很多种方法你可以调用它们并点击IDE’s完成自动键组合时,并不是所有的方法都有效。不要担心!WebDriver总会尝试去做正确的事情,当你调用一个无效的方法时异常会被触发。
所以,当你得到元素之后。你会做什么。或许,你首先会在文本域中填入一些文本:

element.send_keys("some text")

你可以通过调用“键”类来模拟按下箭头:

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

在很多种元素中都可以调用send_keys,这样可以测试诸如GMail中运用的快捷键。这样做的副作用是文本域里面的文本并不会自动清除。相反,当你再次输入时会加入到已经存在的文本的后面。我们可以调用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("Value is: %s" % option.get_attribute("value"))
    option.click()

关于这段代码在文末会用一个例子来详细说明一下
这段程序首先会在页面中找到第一个标签名为select并且name属性为name的元素,并依次循坏遍历标签的name属性为”option”的元素并打印出它们的值。
就像你看到的那样,这并不是处理SELECT元素的最有效的方法。WebDriver’s支持类调用”Select”方法(一个在进行页面交互时非常有用的方法):

from selenium.webdriver.support.ui import Select
select = 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()

这将会在页面上的第一个SELECT取消所有的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对于每一个元素都有方便的“提交”方法。如果你在一个form元素中调用了“提交”方法,WebDriver将会在DOM树里搜索直到找到距离树根最近的一个form节点,然后再提交它。如果不是一个form元素,NoSuchElementException会被触发:

element.submit()

3.3.拖放
你可以使用拖放,把一定数量的元素拖放到其它元素中:

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

from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()

3.4.在窗口和框架之间进行穿梭
现代的浏览器很少有支持很少框架或者被限制在一个单页窗口里。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>

另外,你也可以把”window handle”传递给”switch_to_window()”方法。知道这一点之后,就可以遍历所有打开的窗口:

for handle in driver.window_handles:
    driver.switch_to_window(handle)

你可以在不同的框架之间进行转换:

driver.switch_to_frame("frameName")

你可以通过逗号分隔路径来获取子框架,也可以通过索引来获取框架:

driver.switch_to_frame("frameName.0.child")

这行代码会跳到框架名为”frameName”的所有名为”child”的子框架中的第一个子框架。所有的框架都会从*top*中评估。
当我们在这框架中做完所有的工作后,还需要用下面的方法返回到父框架:

driver.switch_to_default_content()

3.5.弹出对话框
Selenium WebDriver内置支持处理对话框。触发了弹出窗口之后,可以用如下方式来获取alert:

alert = driver.switch_to_alert()

这将会返回一个当前的alert对象。通过这个对象,你可以接受,关闭,读取甚至输入提示。这个界面在警报,确认,提交方面做得也很好。可以通过API文档来获取更多的信息。
3.6.导航:历史与位置
之前,我们用get命令来导航到一个网页。如你所见,浏览器有很多小的以任务为中心的接口,导航就是有用的任务。你可以用get方法导航到一个网页:

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

以下两种方式会在你浏览的历史中倒退或者前进:

driver.forward()
driver.back()

这个功能完全取决于底层驱动。当你习惯了一个浏览器之后突然切换到另一个浏览器,再次调用这些方法时可能会出现一些错误。
3.7. Cookies
在离开这一页进入下一页之前你或许会对如何使用cookies感兴趣。首先,你要在有cookie起作用的范围内使用:

# Go to the correct domain
driver.get("http://www.example.com")

# Now set the cookie. This one's valid for the entire domain
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)

# And now output all the available cookies for the current URL
driver.get_cookies()

一个关于3.2.例子
这个网页为例,要定位到Quick search。
关于Quick search网页源码

<div id="searchbox" style="display: none" role="search">
  <h3>Quick search</h3>
    <form class="search" action="search.html" method="get">
      <div><input type="text" name="q" /></div>
      <div><input type="submit" value="Go" /></div>
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
<div>

代码:

driver.get('http://selenium-python.readthedocs.io/navigating.html')
assert "Navigating" in driver.title
elem = driver.find_element_by_xpath("//form[@class='search']")
all_options = elem.find_elements_by_tag_name("input")
for option in all_options:
    print('Value is : %s' % option.get_attribute("name"))

运行结果:

Value is : q
Value is : 
Value is : check_keywords
Value is : area

如有错误,敬请指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值