selenium官方文档、API 翻译(三):获取文本值、用户输入、多标签多窗口、Cookie

@高效码农  May 2, 2019

一、获取文本值

---------------------------------------------------------------------------------
人们通常希望检索元素中包含的innerText值。这将返回单个字符串值。请注意,这只会返回页面上显示的可见文本。

element = driver.find_element_by_id("element_id")
element.text

二、用户输入 - 填写表单

---------------------------------------------------------------------------------
我们已经看过如何在textarea或text字段中输入文本,但其他元素呢?您可以“切换”复选框的状态,也可以使用“单击”设置选择的OPTION标记。处理SELECT标签也不错:

select = driver.find_element_by_tag_name("select")
allOptions = select.find_elements_by_tag_name("option")
for option in allOptions:
    print "Value is: " + option.get_attribute("value")
    option.click()

这将在页面上找到第一个“SELECT”元素,并依次遍历每个OPTION,打印出它们的值,然后依次选择每个OPTION。正如您将注意到的,这不是处理SELECT元素的最有效方法。WebDriver的支持类包括一个名为“Select”的支持类,它提供了与这些类交互的有用方法。

# available since 2.12
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_tag_name("select"))
select.deselect_all()
select.select_by_visible_text("Edam")

这将从页面上的第一个SELECT中取消选择所有OPTION,然后选择带有显示文本“Edam”的OPTION。

填写完表单后,您可能想要提交表单。一种方法是找到“提交”按钮并单击它:

driver.find_element_by_id("submit").click()

或者,WebDriver在每个元素上都有“提交”的便捷方法。如果在表单中的元素上调用它,WebDriver将向上走DOM,直到找到封闭的表单,然后调用submit。如果元素不在表单中,那么NoSuchElementException将抛出:

element.submit()

三、多窗口、多标签

---------------------------------------------------------------------------------
某些Web应用程序具有许多标签或多个窗口。WebDriver支持使用“switchTo”方法在多个窗口之间移动:

driver.switch_to.window("windowName")

所有调用driver现在将被解释为定向到特定窗口。但你怎么知道窗口的名字?看一下打开它的javascript或链接:

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

或者,您可以将“窗口句柄”传递给“switchTo()。window()”方法。知道这一点,就可以迭代每个打开的窗口,如下所示:

for handle in driver.window_handles:
    driver.switch_to.window(handle)

您还可以从一个标签切换到另一标签(或切换到iframe):

driver.switch_to.frame("frameName")

三、弹出对话框

---------------------------------------------------------------------------------
从Selenium 2.0 beta 1开始,内置支持处理弹出对话框。触发打开弹出窗口的操作后,您可以使用以下命令访问对话框:

alert = driver.switch_to.alert
# usage: alert.dismiss(), etc.

这将返回当前打开的对话框对象。使用此对象,您现在可以接受,关闭,读取其内容,甚至可以键入提示。此界面在警告,确认和提示方面同样有效。有关更多信息,请参阅JavaDocsRubyDocs

四、导航:历史和位置

---------------------------------------------------------------------------------
之前,我们介绍了使用“get”命令(driver.get("http://www.example.com")或driver.Url="http://www.example.com"在C#中)导航到页面 。正如您所见,WebDriver具有许多较小的,以任务为中心的界面,导航是一项有用的任务。因为加载页面是一个基本要求,所以这样做的方法存在于主WebDriver接口上,但它只是一个同义词:

driver.get("http://www.example.com")  # python doesn't have driver.navigate

“导航”界面还提供了在浏览器历史记录中前后移动的功能:

driver.forward()
driver.back()

请注意,此功能完全取决于底层浏览器。如果您习惯于一个浏览器的行为而不是另一个浏览器,那么当您调用这些方法时,可能会发生意外情况。

四、Cookie

---------------------------------------------------------------------------------
cookie的使用

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

# Now set the cookie. Here's one for the entire domain
# the cookie name here is 'key' and its value is 'value'
driver.add_cookie({'name':'key', 'value':'value', 'path':'/'})
# additional keys that can be passed in are:
# 'domain' -> String,
# 'secure' -> Boolean,
# 'expiry' -> Milliseconds since the Epoch it should expire.

# And now output all the available cookies for the current URL
for cookie in driver.get_cookies():
    print "%s -> %s" % (cookie['name'], cookie['value'])

# You can delete cookies in 2 ways
# By name
driver.delete_cookie("CookieName")
# Or all of them
driver.delete_all_cookies()

五、更改用户代理

---------------------------------------------------------------------------------
使用Firefox驱动程序很容易:

profile = webdriver.FirefoxProfile()
profile.set_preference("general.useragent.override", "some UA string")
driver = webdriver.Firefox(profile)


评论已关闭