问答 React 实现的下拉选择框,通过 css,xpath,id 在控制台用 f12 验证都可以成功定位到元素。但是一写到脚本里一直定位元素失败

呼噜呼噜 · 2024年12月30日 · 最后由 呼噜呼噜 回复于 2024年12月31日 · 5562 次阅读

页面元素

代码

rule_page.py

select_action =(By.ID,'ruleActionData_0_type')
 # 定位添加执行动作
    def locate_action(self,text):
        self.add_action.click()
        try:
            WebDriverWait(self.driver, 60).until(
                lambda driver: driver.execute_script('return document.readyState') == 'complete'
            )
            # 选择执行动作框
            action = WebDriverWait(self.driver, 60).until(
                # visibility_of_element_located方法接收
                EC.element_to_be_clickable(self.select_action)
                )
            action.click()
            WebDriverWait(self.driver, 60).until(
                lambda driver: driver.execute_script('return document.readyState') == 'complete'
            )
            # 选择具体的动作
            action_dialog = WebDriverWait(self.driver,60).until(
                # visibility_of_element_located方法接收
                EC.element_to_be_clickable(self.alert_dialog)
            )
            action_dialog.click()
            WebDriverWait(self.driver, 60).until(
                lambda driver: driver.execute_script('return document.readyState') == 'complete'
            )
            # 选择指定时机
            time_dialog = WebDriverWait(self.driver, 60).until(
                # visibility_of_element_located方法接收
                EC.visibility_of_element_located(self.select_time)
            )
            time_dialog.click()
            WebDriverWait(self.driver,60).until(
                lambda driver: driver.execute_script('return document.readyState') == 'complete'
            )
            # 选择具体的时机
            time_value = WebDriverWait(self.driver, 60).until(
                # visibility_of_element_located方法接收
                EC.visibility_of_element_located(self.select_time_value)
            )
            time_dialog.click()
            time_value.click()
            self.select_input=text
            print("All elements clicked and inputs set successfully.")
        except TimeoutException:
            print("Element not found or not clickable within the given time.")
            self.driver.save_screenshot('timeout_error.png')
        except ElementClickInterceptedException:
            print("Element click intercepted. Please check if any element is covering the target element.")
            self.driver.save_screenshot('click_intercepted_error.png')

        except NoSuchElementException:
            print("Element not found with the specified criteria.")
            self.driver.save_screenshot('no_such_element_error.png')
        except Exception as e:
            print(f"An unexpected error occurred: {e}")
            self.driver.save_screenshot('unexpected_error.png')
        raise

测试函数

@user1res("login")
def test_config_rule(login):
    """配置规则"""
    # 调用封装函数进入app设置页面
    enter_app_set(login, test_data['create_app']['appname'])
    rule_page = RulePage(login)
    rule_page.locate_rule()
    rule_page.locate_child()
    rule_page.locate_set_rule(test_data['rule']['field'])
    time.sleep(5)
    rule_page.locate_action(test_data['rule']['action'])
    rule_page.locate_save()

rule_page.locate_action(test_data['rule']['action']) 这行代码一直是把执行动作弹框点击出来后,不执行下一步

保存信息



共收到 6 条回复 时间 点赞

试试更新为父节点的元素呢?不去点击 input 元素,试试点击 span?

RuntimeError: No active exception to reraise 没有可以重新抛出的异常。
rule_page.py 最后一行的 raise 写法不对,把它去掉,或者加一级缩进且改成 raise e。

还真的是。我用了 span 就能成功定位了。但是按理来说 id 应该是最唯一可以定位的呀。怎么这里用 span 就行了呢。求大佬顺带答惑一下。感谢!!

Zhang Jia #2 回复

感谢提醒。已移除这个 raise 添加了更具体的 except Exception 语句替换

可以定位,不代表可以点击,要看具体前端元素的属性

学到了。感谢!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册