书接上文和上上文:
处理不同情况的等待
在Selenium自动化测试中网页可能需要花费一些时间来加载,或者希望在触发测试代码之前可以看到页面上的特定Web元素。在这种情况下,需要执行“显式等待”,这是一段代码,通过它可以定义要发生的条件,然后再继续执行代码。
Selenium具有WebDriverWait
,可以将其应用于任何具有条件和持续时间的Web元素。如果不存在执行等待的元素或发生超时,则可能引发异常。
在下面的示例中,我们等待link_text=Sitemap
加载到页面上,并在WebDriverWait
方法中指定了超时。如果在超时时间内未加载该元素,则抛出异常。
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from pip._vendor.distlib import resources
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("https://www.***.com/")
timeout = 10
try:
element_present = EC.presence_of_element_located((By.LINK_TEXT, 'Sitemap'))
WebDriverWait(driver, timeout).until(element_present)
except TimeoutException:
print("查找用户超时!")
driver.quit()复制代码
网页中的滚动操作
在使用Selenium执行测试自动化时,您可能需要在页面上执行上滚/下滚
操作的要求。您可以将execute_script()
与window.scrollTo(JS)
代码用作参数来实现相同的效果。在下面的示例中,加载被测网站后,我们滚动到页面的末尾。
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("https://www.***.com/")
timeout = 10
''' 滚动到页尾'''
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
sleep(10)
''' 滚动到页首'''
driver.execute_script("window.scroll(0, 0);")
sleep(10)
driver.quit()复制代码
使用Selenium放大和缩小
为了在进行Selenium自动化测试时放大或缩小,应使用transform
CSS属性(适用于相应的浏览器),该属性可让您在页面上执行放大,缩小,旋转,倾斜等操作。不同类型的浏览器的CSS参数如下
在下面的示例中,我们将浏览器中加载的网页缩小200%,然后再放大100%(即恢复正常)。由于我们使用的是Firefox浏览器,因此我们使用了MozTransform
CSS属性。
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("https://www.***.com/")
timeout = 10
''' 放大 200% '''
driver.execute_script('document.body.style.MozTransform = "scale(2.0)";')
driver.execute_script('document.body.style.MozTransformOrigin = "0 0";')
sleep(10)
''' 恢复 100% '''
driver.execute_script('document.body.style.MozTransform = "scale(1.0)";')
driver.execute_script('document.body.style.MozTransformOrigin = "0 0";')
sleep(10)
driver.quit()复制代码
查找元素的大小
必须首先通过ID搜索元素,然后使用.size
属性来计算搜索到的元素的大小。在下面的示例中,我们在页面中计算按钮create_programmatic_menu(ID = createDestoryButton)
的大小。
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://demos.***/test_Menu.html")
timeout = 10
search_element = driver.find_element_by_id("createDestroyButton")
print(search_element.size)
driver.quit()复制代码
获取元素的X和Y坐标
您必须遵循用于计算元素大小的类似方法。您必须首先通过ID搜索元素,然后使用.location
属性来计算搜索到的元素的X和Y坐标。计算按钮create_programmatic_menu(ID = createDestoryButton)
的X和Y坐标。
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("http://demos.***/test_Menu.html")
timeout = 10
search_element = driver.find_element_by_id("createDestroyButton")
print(search_element.location)
''' Release all the resources '''
driver.quit()复制代码
使用自定义配置文件禁用JavaScript
如果要禁用浏览器的JavaScript支持以验证自动跨浏览器与Selenium自动化测试的兼容性,则需要更改被测浏览器的配置文件设置(在本例中为Firefox),并将更改应用于配置文件。我们使用DEFAULT_PREFERENCES ['frozen'] ['javascript.enabled'] = False
禁用浏览器的JavaScript支持。
执行代码后,您应该通过在地址栏中输入about:config
并搜索javascript.enabled
属性的值来验证配置文件的更改。
from selenium import webdriver
ff_profile = webdriver.FirefoxProfile()
ff_profile.DEFAULT_PREFERENCES['frozen']['javascript.enabled'] = False
ff_profile.set_preference("app.update.auto", False)
ff_profile.set_preference("app.update.enabled", False)
''' 更新配置 '''
ff_profile.update_preferences()
''' 加载配置文件 '''
driver = webdriver.Firefox(ff_profile)
''' 验证是否生效 '''
driver.get("about:config")复制代码
设置手动代理设置
在某些情况下,您可能需要更改代理设置才能执行测试。要更改代理设置,需要首先导入模块selenium.webdriver.common.proxy
。您必须将代理类型设置为MANUAL
,然后更改代理设置,然后将新设置应用到被测浏览器(在我们的示例中为Firefox)。需要用计划用于测试的IP地址和端口号替换ip_address
和port_number
。
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
proxy_settings = Proxy()
''' 修改配置 '''
proxy_settings.proxy_type = ProxyType.MANUAL
proxy_settings.http_proxy = "ip_address:port_number"
proxy_settings.socks_proxy = "ip_address:port_number"
proxy_settings.ssl_proxy = "ip_address:port_number"
''' 添加证书 '''
capabilities = webdriver.DesiredCapabilities.FIREFOX
proxy_settings.add_to_capabilities(capabilities)
driver = webdriver.Firefox(desired_capabilities=capabilities)