selenium常见问题整理--持续更新中

一. 如何实现,selenium headless,即后台运行?

看了下源码,列出以下两种方法:

  1. 直接调用add_arguments("--headless"),设置参数
    from selenium import webdriver
    from selenium.webdriver import DesiredCapabilities
    #假设在Windows平台使用
    
    def init_web():
    
        #首先创建options对象,这里使用的是chromedriver
        options=webdriver.ChromeOptions()
    
        #添加参数
        options.add_argument('--headless')
        options.add_argument('--disable-gpu') #windows平台,可选
        options.add_argument('--window-size=1920,1080') #可选,设置窗口大小
    
        #使用WebDriver JsonWire Protocol连接WebDriver的Server
        driver=webdriver.Remote(desired_capabilities
                                        =DesiredCapabilities.CHROME,options=options)
        driver.get("http://www.baidu.com")
        
        return driver                                 

     

  2.  直接设置headless属性为True,Options().headless=True (没有特殊要求时,这种方法其实更方便)
    from selenium import webdriver
    from selenium.webdriver import DesiredCapabilities
    #假设在Windows平台使用
    
    def init_web():
    
        #首先创建options对象,这里使用的是chromedriver
        options=webdriver.ChromeOptions()
    
        #添加参数
        options.add_argument('--window-size=1920,1080') #可选,设置窗口大小
    
        #源码中headless属性使用了setter描述符,setter中只要传入的值为True,就会更新argument列表
        options.headless=True
    
        #使用WebDriver JsonWire Protocol连接WebDriver的Server
        driver=webdriver.Remote(desired_capabilities
                                        =DesiredCapabilities.CHROME,options=options)
        
        driver.get("http://www.baidu.com")
        return driver                                 

     

二、如何判断一个元素是否存在?

具体的实现有很多,列举以下2种:

  1. 使用wait.py模块中的WebDriverWait类(显示等待),和expected_conditions.py模块中的presence_of_element_located类(该类初始化时,要传入locator参数);until中的第一个参数为一个method
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    def is_element_presence(driver):
    
            try:
                #也可以把until中的方法换成:find_element(By.ID,"测试NoElement")
                WebDriverWait(driver,5,0.5).until
                                  (EC.presence_of_element_located((By.ID,"测试NoElement")))
       
            except:
                return False
             return True
         

     

  2.  使用try..except去捕捉NoSuchElement异常
    from selenium.webdriver.support.wait import WebDriverWait
    
    def is_element_presence(driver):
    
            try:
                #也可以把until中的方法换成:find_element(By.ID,"测试NoElement")
                driver.find_element(By.ID,"测试NoElement")
            except NoSuchElement:
                return False
            return True
         

     

三、判断元素是否可见

使用expected_conditions.py模块中的visibility_of_element_located类

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def is_element_visiable(driver):

       
         #也可以把until中的方法换成:find_element(By.ID,"测试NoElement")
         return EC.visibility_of_element_located((By.ID,"测试NoElement")))
 
     

 

四、如何定位隐藏元素?

style="display: none"的元素不可见,需要执行js将display需改为block

#x先使用js语句修改属性
js = "document.getElementById('测试').style.display='block'"
driver.execute_script(js)
#去定位元素
driver.find_element(By.ID,"测试")

 

五、如何定位动态元素?
具体是怎样的动态元素:

举一个属性动态变化的例子,例如一个元素的class属性为login_button, 但是当鼠标hover在登录按钮处时,class="login_button_hovering",这个时候尽量对class进行模糊匹配,//*[contains(@class,'login_button')], 或者//*[starts-with(@class,'login_button')]

再如,完全由动态触发的元素,这个时候需要先去触发动态事件,再定位

 

好啦,先到这里啦~~~

 

 

 

 

hahah

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页