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

小绵羊 · 2024年12月30日 · 最后由 小绵羊 回复于 2024年12月31日 · 2348 次阅读

页面元素

代码

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 回复

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

小绵羊 回复

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

鲨鱼辣椒 回复

学到了。感谢!

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