selenium选项栏标签动态变化难以选中元素

前端做了同时出现标签最大数量的限制,标签随着选项滚动而变化,导致难以选中想要的元素

可以考虑我写的代码,除了封装了一下selenium思路还是一样的

// 通用菜单
	public void menuSelect(String menuName) throws Exception {
		elementOperate.moveToElement(menuPage.queryMenu());
		Thread.sleep(1000);
		elementOperate.click(menuPage.queryMenuSendKeys());
		Thread.sleep(500);
		elementOperate.sendKeys(menuPage.queryMenuSendKeys(), menuName);
		elementOperate.clickDirectionKey("down", 1);
		List<String> listMenuName = new ArrayList<>();
		// 读取第一个元素name
		String name = elementOperate.getAttribute(menuPage.getMenuList_1(), "name");
		listMenuName.add(name);
		// 按5下鼠标下键读取第二个元素
		elementOperate.clickDirectionKey("down", 5);
		name = elementOperate.getAttribute(menuPage.getMenuList_1(), "name");
		// 对比第二个元素和第一个元素name是否一样
		if (name.equals(listMenuName.get(0))) {
			// 一样说明一共不足6个元素 则读取全部五个元素存入数列
			try {
				listMenuName.add(elementOperate.getAttribute(menuPage.getMenuList_2(), "name"));
				listMenuName.add(elementOperate.getAttribute(menuPage.getMenuList_3(), "name"));
				listMenuName.add(elementOperate.getAttribute(menuPage.getMenuList_4(), "name"));
				listMenuName.add(elementOperate.getAttribute(menuPage.getMenuList_5(), "name"));
			} catch (Exception e) {
			}
			elementOperate.clickDirectionKey("up", 5);//回到第一个位置
		} else {
			// 不一样说明大于五个元素
			// 此时将第二个元素存入数列
			listMenuName.add(name);
			// 继续按下键,读取后续元素存入数列,并判断按下键后读取的第一个div的name是否和第一个数列元素一样,如果一样说明已经重新开始了。用循环
			while (true) {
				elementOperate.clickDirectionKey("down", 1);
				name = elementOperate.getAttribute(menuPage.getMenuList_1(), "name");
				if (name.equals(listMenuName.get(0))) {
					// 此时按一下上键,来到列表最后一栏,读取最后四个元素即可
					elementOperate.clickDirectionKey("up", 1);
					listMenuName.add(elementOperate.getAttribute(menuPage.getMenuList_2(), "name"));
					listMenuName.add(elementOperate.getAttribute(menuPage.getMenuList_3(), "name"));
					listMenuName.add(elementOperate.getAttribute(menuPage.getMenuList_4(), "name"));
					listMenuName.add(elementOperate.getAttribute(menuPage.getMenuList_5(), "name"));
					break;
				} else {
					listMenuName.add(name);
				}
			}
			elementOperate.clickDirectionKey("down", 1);//回到第一个位置
		}
		System.out.println(listMenuName.toString());
		// 取出数列中对应name的索引
		for (String s : listMenuName) {
			if (s.equals(menuName)) {
				Thread.sleep(50);
				elementOperate.clickEnter();
				break;
			}
			elementOperate.clickDirectionKey("down", 1);
		}
	}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 Selenium 定位动态元素时,你可以尝试以下几种方法: 1. 使用显式等待:使用 `WebDriverWait` 类来等待元素的出现或可点击状态。你可以指定等待的最长时间和轮询的频率,直到元素出现或可点击。 ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 创建一个显式等待对象 wait = WebDriverWait(driver, 10) # 10秒为超时时间 # 等待元素出现 element = wait.until(EC.presence_of_element_located((By.ID, 'element_id'))) # 等待元素可点击 element = wait.until(EC.element_to_be_clickable((By.ID, 'element_id'))) ``` 2. 使用隐式等待:在创建 WebDriver 对象之后,设置一个全局的隐式等待时间,在查找元素时等待一段时间,直到元素出现或超时。 ```python driver.implicitly_wait(10) # 10秒为隐式等待时间 # 查找元素 element = driver.find_element(By.ID, 'element_id') ``` 3. 使用动态 XPath:如果元素的属性值是动态生成的,你可以使用 XPath 来定位元素。XPath 提供了各种方法来选择和定位元素,比如使用属性、文本内容、父子关系等。 ```python element = driver.find_element(By.XPATH, '//div[@class="dynamic_class"]') ``` 4. 使用 CSS 选择器:CSS 选择器也可以用于定位动态元素。你可以使用元素的属性、类名、标签名等来选择元素。 ```python element = driver.find_element(By.CSS_SELECTOR, 'input[name="dynamic_name"]') ``` 以上是一些常用的方法,根据具体情况选择合适的方法来定位动态元素

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值