python+selenium 判断元素是否存在,是否可点击,是否被选中--最全的解释,一定不要错过

 

现在的大多数的Web应用程序是使用Ajax技术。当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出 ElementNotVisibleException 异常。 使用 waits, 我们可以解决这个问题。waits提供了一些操作之间的时间间隔- 主要是定位元素或针对该元素的任何其他操作。
Selenium Webdriver 提供两种类型的waits - 隐式和显式。 显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。 而隐式等待让Webdriver等待一定的时间后再才是查找某元素。

显式等待:

显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码。 最糟糕的案例是使用time.sleep(),它将条件设置为等待一个确切的时间段。 这里有一些方便的方法让你只等待需要的时间。WebDriverWait结合ExpectedCondition 是实现的一种方式。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

WebDriverWait(driver, 10)设置了一个10秒上限的等待时间
自动化的Web浏览器中一些常用的预期条件,下面列出的是每一个实现, Selenium Python binding都提供了一些方便的方法,这样你就不用去编写 expected_condition类或是创建至今的工具包去实现他们。传入的参数都是元组类型的locator,如(By.ID, 'kw')
expected_conditions as EC后面最最常接的预期条件:


driver.find_element_by_id('kw').is_displayed()   #查看元素是否可见

EC.presence_of_element_located((By.ID,"kw"))   #查看某个元素是否存在

EC.element_to_be_clickable()         #查看元素是否可点击

EC.element_located_to_be_selected((By.ID,"kw")) #某个预期元素是否被选中

补充:

#frame可见并切换到该frame上
EC.frame_to_be_available_and_switch_to_it
#元素可以点击,常用于按键
EC.element_to_be_clickable
#元素出现,只要一个符合条件的元素加载出来就通过
EC.presence_of_element_located
#元素出现,须所有符合条件的元素都加载出来,这个基本上就是你爬取的最主要内容了
EC.presence_of_all_elements_located
#判断某段文本是否出现在某元素中,常用于判断输入页数与实际高亮页数是否一致
EC.text_to_be_present_in_element

By后面常接的选择方式(未列出全部,全部请dir(By)查看):

By.CLASS_NAME #根据class的名称
By.ID #根据id的名称
By.TAG_NAME #根据标签的名称

#最最无敌的两个,直接从开发者工具中就可以无脑用css或xpath方法复制元素的位置
By.CSS_SELECTOR #应用CSS选择器方法
By.XPATH #应用XPATH选择器方法

以上一篇文章的登录QQ空间为例,我们用显式等待修改下代码:

from selenium import webdriver
#为了增加显式等待,增加以下三个模块
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


url = 'http://user.qzone.qq.com/'
driver = webdriver.Chrome()
driver.get(url)
#设置等待上限10秒
timeout = WebDriverWait(driver, 10)

#切换到登录框中的frame
timeout.until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'login_frame')))

switcher_plogin = timeout.until(EC.element_to_be_clickable((By.ID, 'switcher_plogin')))
#点击“帐号密码登录”按钮
switcher_plogin.click()
#定位帐号输入框
username = timeout.until(EC.presence_of_element_located((By.ID, 'u')))
#username = driver.find_element_by_id('u')
#清空帐号输入框内容
username.clear()
#填写帐号
username.send_keys('你的账号')
password = timeout.until(EC.presence_of_element_located((By.ID, 'p')))
#password = driver.find_element_by_id('p')
password.clear()
password.send_keys('你的密码')
#点击“登录”按钮
log_in = timeout.until(EC.element_to_be_clickable((By.ID, 'login_button'))).click()
#driver.quit()

还可以用username.text获得标签中的文字信息。

隐式等待

如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")



作者:X_xxieRiemann
链接:https://www.jianshu.com/p/acc34c8861ca
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 19
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在使用Python Selenium测试 Web 应用程序时,判断元素是否存在是一个非常重要的步骤。此操作可确保我们的测试脚本按预期执行,并且不会因为找不到元素而崩溃。 方法一:使用find_elements_by_xxx() 我们可以使用Python Selenium中的find_elements_by_xxx()方法检查是否存在元素。举例来说,假设我们要检查一个页面上是否存在一个名为“login_form”的表单,我们可以使用以下代码: ```python from selenium import webdriver driver = webdriver.Chrome() # 打开页面 driver.get('http://example.com') # 定位表单元素 login_form = driver.find_elements_by_name('login_form') # 判断表单元素是否存在 if len(login_form) > 0: print('表单元素存在') else: print('表单元素不存在') ``` 在代码中,我们使用了find_elements_by_name()方法找到名为“login_form”的表单元素。如果该元素存在,它会返回元素对象的列表。我们只需要检查列表的长度是否为零就可以知道该元素是否存在。 方法二:使用try-except语句 另一种方法是使用Python的try-except语句。我们可以尝试使用find_element_by_xxx()方法找到元素,如果找不到它将抛出一个NoSuchElementException异常。我们可以使用以下代码来实现: ```python from selenium import webdriver from selenium.common.exceptions import NoSuchElementException driver = webdriver.Chrome() # 打开页面 driver.get('http://example.com') try: # 查找元素 element = driver.find_element_by_name('login_form') except NoSuchElementException: # 如果找不到元素,抛出异常 print('表单元素不存在') else: # 如果找到元素,打印信息 print('表单元素存在') ``` 在代码中,我们使用try-except语句尝试查找名为“login_form”的表单。如果找到该元素,程序会跳过except块并打印一条消息。如果找不到该元素,程序将抛出NoSuchElementException异常并跳到except块,我们可以在这里处理这种情况。 总结: 无论您选择哪种方法,判断元素是否存在都是必要的。在测试Web应用程序时,这非常有用,可以确保测试脚本按预期执行,同时减少运行时的错误和异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值