selenium常见问题(网页缩放、滑动,元素获取不到......)

文章介绍了在使用Selenium进行自动化测试时遇到的元素点击问题及其解决方案,包括执行JavaScript点击和使用ActionChains。同时,提供了四种滚动条操作方法,如JS脚本和使用ActionChains。此外,还讲解了如何等待元素加载和缩放页面的方法,这些都是Web自动化测试中的常见操作。

1. Selenium无法点击元素,报错:ElementClickInterceptedException:element click intercepted

在这里插入图片描述
解决办法:

  • 方法一:
    element = driver.find_element_by_xpath("表达式") driver.execute_script("arguments[0].click();", element)
  • 方法二:
    element = driver.find_element_by_xpath('表达式') webdriver.ActionChains(driver).move_to_element(element ).click(element ).perform()

2. selenium操作下拉滚动条方法

  • 方法一 使用js脚本直接操作:
    js = "var q=document.getElementById('id').scrollTop=10000" driver.execute_script(js)
  • 方法二 使用JavaScript脚本将滚动条拖动到指定地方:
    target = driver.find_element_by_id("id_keypair") # 需要将滚动条拖动至的指定的元素对象定位 driver.execute_script("arguments[0].scrollIntoView();", target) # 将滚动条拖动到元素可见的地方
  • 方法三 根据页面显示进行变通(在本实例中的页面中,密码是输入框,正常手工操作时,可以通过tab键可以从用户框切换到密码框中,所以根据此思路,在python中也可以发送tab键来切换,使元素显示。):
    from selenium.webdriver.common.keys import Keys # 导入Keys类 driver.find_element_by_id("id_login_method_0").send_keys(Keys.TAB) # 定位元素并操作输入
  • 方法四 send_keys(Keys.END) 模拟向页面发送空格键:
    注意: 发送空格键的元素应该是整个页面对象,比如说定位到页面body后进行操作
#coding=utf-8
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.common.action_chains import ActionChains
    browser=webdriver.Chrome("G:/dj/chromedriver.exe")
    wait=WebDriverWait(browser,10)
    browser.set_window_size(1400,900)
    import time
    def search():
        try:
            browser.get("https://www.taobao.com")
            total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"body > div:nth-child(29)")))
            for i in range(5):
                 browser.find_element_by_tag_name('body').send_keys(Keys.Space)
                 time.sleep(1)
        except TimeoutException:
            search()
    search()
  • 方法五 使用鼠标操作:
#coding=utf-8
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.common.action_chains import ActionChains
    browser=webdriver.Chrome("G:/dj/chromedriver.exe")
    wait=WebDriverWait(browser,10)
    browser.set_window_size(1400,900)
    import time
    def search():
        try:
            browser.get("https://www.taobao.com")
            total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"body > div:nth-child(29)")))
            target = browser.find_element_by_css_selector('body > div:nth-child(29)')
            actions = ActionChains(browser)
            actions.move_to_element(target)
            actions.perform()
        except TimeoutException:
            search()
    search()

3. 等待元素加载

#创建WebDriverWait对象
    wait = WebDriverWait(browser, 10)
	wait.until(expected_conditions.visibility_of_element_located((By.XPATH,  'elemental')))

4. 缩放页面

script = "document.body.style.zoom='75%'"
driver.execute_script(script)
### 解析 `actions.w3c_actions = ActionBuilder(driver, mouse=pointer_input)` 的含义 #### 1. `ActionChains` 和 W3C Actions 的关系 在 Selenium 中,`ActionChains` 是一个用于模拟用户交互行为的类。它默认支持鼠标和键盘操作,但在某些情况下(如需要模拟触摸屏手势),需要使用更底层的 W3C Actions API 来实现复杂的交互行为[^1]。 #### 2. `w3c_actions` 的作用 `w3c_actions` 是 `ActionChains` 对象的一个属性,用于存储与 W3C Actions 相关的配置和操作序列。通过设置 `actions.w3c_actions`,可以自定义交互设备(如鼠标、触摸屏等)的行为模式[^1]。 #### 3. `ActionBuilder` 的功能 `ActionBuilder` 是 Selenium 提供的一个类,用于构建 W3C Actions 操作序列。它允许开发者指定不同的输入设备(如鼠标、触摸屏等)并定义其行为。在代码中,`ActionBuilder` 被用来替换默认的鼠标操作为触摸屏操作[^1]。 #### 4. `PointerInput` 的作用 `PointerInput` 是 W3C Actions 规范中的一个类,用于定义指针设备(如鼠标或触摸屏)的行为类型。通过指定设备类型(如 `interaction.POINTER_TOUCH` 或 `interaction.POINTER_MOUSE`)和设备名称,可以创建一个指针输入对象[^1]。 #### 5. 具体代码解析 ```python actions = ActionChains(driver) pointer_input = PointerInput(interaction.POINTER_TOUCH, "touch") actions.w3c_actions = ActionBuilder(driver, mouse=pointer_input) ``` - **第一行**:实例化 `ActionChains` 对象,并将其绑定到 WebDriver 实例 `driver` 上。 - **第二行**:创建一个触摸屏输入对象 `pointer_input`,指定设备类型为 `interaction.POINTER_TOUCH`,设备名称为 `"touch"`[^1]。 - **第三行**:将 `actions.w3c_actions` 替换为一个新的 `ActionBuilder` 实例,该实例使用 `pointer_input` 作为鼠标设备,从而实现触摸屏操作的支持[^1]。 #### 6. 替换默认鼠标操作的意义 通过设置 `actions.w3c_actions`,可以将默认的鼠标操作替换为触摸屏操作。这使得开发者能够模拟触摸屏手势(如滑动缩放等),而不仅仅是传统的鼠标点击或拖拽操作[^1]。 --- ### 示例代码:模拟滑动操作 以下是一个完整的代码示例,展示如何使用上述代码片段来实现滑动操作: ```python from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.actions.interaction import Interaction from selenium.webdriver.common.actions.action_builder import ActionBuilder from selenium.webdriver.common.actions.pointer_input import PointerInput # 初始化 WebDriver driver = webdriver.Chrome() try: # 创建触摸屏输入对象 touch_input = PointerInput(Interaction.POINTER_TOUCH, "touch") # 实例化 ActionChains 并绑定到 WebDriver actions = ActionChains(driver) # 将默认的鼠标操作替换为触摸屏操作 actions.w3c_actions = ActionBuilder(driver, mouse=touch_input) # 定义滑动操作 start_x, start_y = 100, 500 # 起始坐标 end_x, end_y = 100, 100 # 结束坐标 # 移动到起始位置并按下 actions.w3c_actions.pointer_action.move_to_location(start_x, start_y) # 移动到起始位置 actions.w3c_actions.pointer_action.pointer_down() # 按下触摸屏 # 移动到目标位置 actions.w3c_actions.pointer_action.move_to_location(end_x, end_y) # 移动到结束位置 # 抬起手指 actions.w3c_actions.pointer_action.release() # 释放触摸屏 # 执行动作 actions.perform() finally: driver.quit() ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值