3. 打开一个页面

    WebDriver 将等待,直到页面完全加载完毕(其实是等到 onload 方法执行完毕),然后返回继续执行你的脚本。值得注意的是,如果你的页面使用了大量的Ajax加载,WebDriver可能不知道什么时候页面已经完全加载。如果你想确保也main完全加载完毕,可以使用:ref:waits <waits>

    只是打开页面其实并没有什么卵用。我们真正想要的是与页面做交互。更具体地说,对于一个页面中的HTML元素,首先我们要找到他。WebDriver提供了大量的方法帮助你去查找元素,例如:已知一个元素定义如下:

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

    你可以通过下面的方法查找他:

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

    你还可以通过链接的文本查找他,需要注意的是,这个文本必须完全匹地配。当你使用XPATH时,你必须注意,如果匹配超过一个元素,只返回第一个元素。如果上面也没找到,将会抛出 ``NoSuchElementException``异常。

    WebDriver有一个”基于对象”的API; 我们使用相同的接口表示所有类型的元素。这就意味着,当你打开你的IDE的自动补全的时候,你会有很多可以调用的方法。但是并不是所有的方法都是有意义或是有效的。不过不要担心!当你调用一些毫无意义的方法时,WebDriver会尝试去做一些正确的事情(例如你对一个”meta”元素调用”setSelected()”方法的时候)。

    所以,当你拿到ige元素时,你能做什么呢?首先,你可能会想在文本框中输入一些内容:

    1. element.send_keys("some text")

    你还可以通过”Keys”类来模式输入方向键:

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

    对于任何元素,他可能都叫 send_keys ,这就使得它可以测试键盘快捷键,比如当你使用Gmail的时候。但是有一个副作用是当你输入一些文本时,这些输入框中原有的文本不会被自动清除掉,相反,你的输入会继续添加到已存在文本之后。你可以很方便的使用 clear 方法去清除input或者textarea元素中的内容:

    1. element.clear()

    3.2. 填写表格

    我们已经知道如何在input或textarea元素中输入内容,但是其他元素怎么办?你可以“切换”下拉框的状态,你可以使用方法去做一些事情,比如选择下拉列表,处理SELECT元素其实没有那么麻烦:

    1. all_options = element.find_elements_by_tag_name("option")
    2. for option in all_options:
    3. print("Value is: %s" % option.get_attribute("value"))
    4. option.click()

    正如你说看到的那样,这不是处理 SELECT 元素最好的方法。WebDriver的支持类包括一个叫做``Select``的类,他提供有用的方法处理这些内容:

    1. from selenium.webdriver.support.ui import Select
    2. select = Select(driver.find_element_by_name('name'))
    3. select.select_by_index(index)
    4. select.select_by_visible_text("text")
    5. select.select_by_value(value)

    WebDriver 也提供一些有用的方法来取消选择已经选择的元素:

    这将取消选择所以的OPTION。

    假设在一个案例中,我们需要列出所有已经选择的选项,Select类提供了方便的方法来实现这一点:

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

    获得所以选项:

    1. options = select.options

    一旦你填写完整个表单,你应该想去提交它,有一个方法就是去找到一个“submit”按钮然后点击它:

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

    或者,WebDriver对每一个元素都有一个叫做 “submit” 的方法,如果你在一个表单内的元素上使用该方法,WebDriver会在DOM树上就近找到最近的表单,返回提交它。如果调用的元素不再表单内,将会抛出NoSuchElementException异常:

      您可以使用拖放,无论是移动一个元素,或放到另一个元素内:

      1. element = driver.find_element_by_name("source")
      2. target = driver.find_element_by_name("target")
      3.  
      4. from selenium.webdriver import ActionChains
      5. action_chains = ActionChains(driver)
      6. action_chains.drag_and_drop(element, target).perform()

      3.4. 在不同的窗口和框架之间移动

      对于现在的web应用来说,没有任何frames或者只包含一个window窗口是比较罕见的。WebDriver 支持在不同的窗口之间移动,只需要调用方法即可:

      1. driver.switch_to_window("windowName")
      1. <a href="somewhere.html" target="windowName">Click here to open a new window</a>

      或者,你可以在”switch_to_window()”中使用”窗口句柄”来打开它,知道了这些,你就可以迭代所有已经打开的窗口了:

      你还可以在不同的frame中切换 (or into iframes):

      1. driver.switch_to_frame("frameName")

      通过“.”操作符你还可以获得子frame,并通过下标指定任意frame,就像这样:

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

      如何获取名叫“frameName”的frame中名叫 “child”的子frame呢?来自topframe的所有的frame都会被评估All frames are evaluated as if from top.

      一旦我们完成了frame中的工作,我们可以这样返回父frame:

      1. driver.switch_to_default_content()

      Selenium WebDriver 内置了对处理弹出对话框的支持。在你的某些动作之后可能会触发弹出对话框,你可以像下面这样访问对话框:

      1. alert = driver.switch_to_alert()

      它将返回当前打开的对话框对象。使用此对象,您现在可以接受、排除、读取其内容,甚至可以在prompt对话框中输入(译注:prompt()是对话框的一种,不同于alert()对话框,不同点可以自行百度)。这个接口对alert, confirm, prompt 对话框效果相同。参考相关的API文档获取更多信息。

      3.6. 访问浏览器历史记录

      在之前的文章中,我们使用get命令打开一个页面, (),WebDriver有很多更小的,以任务为导向的接口,navigation就是一个有用的任务,打开一个页面你可以使用get:

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

      在浏览历史中前进和后退你可以使用:

      1. driver.forward()

      在我们结束这一节之前,或许你对如何操作Cookies可能会很感兴趣。首先,你需要打开一个也面,因为Cookie是在某个域名下才生效的:

      1. ::