Selector Hub可定位元素,但Selenium抛出No Such Element Exception异常
解决Selenium定位OrangeHRM元素时的NoSuchElementException异常
你遇到的情况是:在SelectorHub里能定位到目标元素,但执行Selenium代码时抛出NoSuchElementException,目标是获取OrangeHRM系统用户页面的列文本,原代码如下:
tcols = drive.find_element(By.XPATH,"//div[@role='rowgroup']/div[1]/div/div/div[2]/div[3]/div/div[2]")
下面是几个实用的解决办法:
等待元素完全加载
页面渲染速度可能比代码执行慢,直接查找会找不到元素。用显式等待让Selenium等元素可见后再操作:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 最长等待10秒,直到元素可见 tcols = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, "//div[@role='rowgroup']/div[1]/div/div/div[2]/div[3]/div/div[2]")) ) print(tcols.text)优化XPath的稳定性
你用的XPath是基于绝对层级的,页面结构稍有变动就会失效。换成结合元素属性或文本的相对定位,比如目标列是"Role"相关内容,可以这样写://div[@role='rowgroup']//div[text()='Role']/../following-sibling::div[2]或者利用OrangeHRM表格的类名
oxd-table-cell来定位://div[@role='rowgroup']//div[contains(@class, 'oxd-table-cell') and text()='Admin']排查iframe嵌套问题
虽然这个页面一般没有iframe,但如果页面存在嵌套iframe,必须先切换到对应iframe才能定位元素:# 替换成实际的iframe id或name driver.switch_to.frame("target_iframe") tcols = driver.find_element(By.XPATH, "//div[@role='rowgroup']/div[1]/div/div/div[2]/div[3]/div/div[2]") # 操作完成后切回主页面 driver.switch_to.default_content()处理元素不在可视区域的情况
如果目标元素在页面下方,需要先滚动到元素位置再定位:element = driver.find_element(By.XPATH, "//div[@role='rowgroup']/div[1]/div/div/div[2]/div[3]/div/div[2]") driver.execute_script("arguments[0].scrollIntoView();", element)
内容的提问来源于stack exchange,提问作者RAHUL BHATIA
相关产品推荐
相关产品推荐

