新闻中心
J9官网你的剧本就跑去操作了-中国(九游会)官方网站

#python#J9官网
群众好,我是老K。
最近有哥们儿跟我吐槽,说他写的Selenium自动化剧本,跑起来就像抽风一样,俄顷好俄顷坏,相似的剧本换个时期跑就报错,搞得他头齐大了。我一听就乐了,这典型的便是Selenium恭候机制没用好啊!
别看“恭候”这两个字浅薄,在自动化测试里,它然则个大常识。今天老K就来跟群众伙儿好好聊聊Selenium的恭候机制,保证让你听完之后,剧本稳如老狗,再也不怕“假死”报错!
为啥你的Selenium剧本老“假死”?
我们先来说说为啥会出现剧本“假死”的情况。你念念啊,我们写的Selenium剧本,推论速率那是嗖嗖的快,但是浏览器加载网页元素的速率可没那么快。绝顶是当今网页齐可爱用Ajax、JavaScript多样动态加载数据,元素还没加载出来,你的剧本就跑去操作了,那细则报错啊!就像你还没把饭菜端上桌,来宾就跑来要吃饭,这不“假死”才怪。
是以,恭候的筹谋便是让Selenium剧本的速率慢下来,等等网页元素加载完成,再进行下一步操作。阐发了这少许,你就知说念恭候机制有多迫切了吧?
Selenium恭候机制大揭秘:
Selenium 提供了几种恭候神色,我们一个一个来扒。
1. 隐式恭候(Implicit Wait):偷懒式恭候,全局成效
隐式恭候就像你开导了一个全局的“最长恭候时期”。一朝你开导了隐式恭候,WebDriver在查找元素的时候,要是在指定的时期内莫得找到,它会一直恭候到超平淡间结束,要是照旧没找到,才会抛出 NoSuchElementException 荒谬。默许情况下,隐式恭候是开导为0的。
driver = webdriver.Chrome()driver.implicitly_wait(10) # 开导隐式恭候为10秒driver.get("https://www.example.com")element = driver.find_element(By.ID, "element_id") # 查找元素,要是没找到会恭候最多10秒
隐式恭候的优点:
使用浅薄:只需要开导一次,全局成效,后头的整个元素查找齐会行使这个恭候时期。代码粗放:不需要每个元素齐单独开导恭候,代码看起来相比领路。
隐式恭候的错误:
收尾较低:即使元素很快就加载出来了,它也会傻傻地恭候到超平淡间,影响剧本推论收尾。不够活泼:全局开导,无法针对不同的元素开导不同的恭候时期。
2. 显式恭候(Explicit Wait):精确打击,按需恭候
显式恭候就更高等一些了,它不错针对特定的元素开导恭候条目和超平淡间。你需要融合 WebDriverWait 和 ExpectedConditions 来使用。
WebDriverWait(driver, timeout, poll_frequency=0.5):创建一个WebDriverWait对象,driver 是WebDriver实例,timeout 是最长恭候时期(秒),poll_frequency 是轮询时期(默许0.5秒)。ExpectedConditions: 是一系列预界说的恭候条目,比如元素可见、元素可点击、元素存在等等。
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Chrome()driver.get("https://www.example.com")try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "element_id")) ) # 元素找到了,不错进行操作了 element.send_keys("Hello")except TimeoutException: print("元素查找超时!")finally: driver.quit()
常用的ExpectedConditions:
presence_of_element_located(locator): 判断元素是否存在在DOM树中,不一定可见。visibility_of_element_located(locator): 判断元素是否可见,即存在于DOM树中况且可见。element_to_be_clickable(locator): 判断元素是否可点击,即元素可见且可交互。text_to_be_present_in_element(locator, text): 判断元素的文本内容是否包含指定的文本。title_contains(title): 判断页面标题是否包含指定的文本。url_contains(url): 判断面前URL是否包含指定的URL片断。
显式恭候的优点:
精确高效:只恭候需要的元素,不会铺张时期,收尾更高。活泼可控:不错针对不同的元素开导不同的恭候条目和超平淡间,愈加活泼。可读性好:代码逻辑更显明,易于联接和顾惜。
显式恭候的错误:
代码稍显复杂:需要引入稀奇的库和对象,代码略略多一些。需要手动开导:每个需要恭候的元素齐需要手动开导显式恭候。
3. FluentWait:更雄壮的自界说恭候
FluentWait 是显式恭候的一种更高等的用法,它提供了更雄壮的自界说功能,不错让你更致密地戒指恭候经过。
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWait, FluentWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.common.exceptions import NoSuchElementException, TimeoutExceptionimport timedriver = webdriver.Chrome()driver.get("https://www.example.com")wait = FluentWait(driver)wait.timeout = 10 # 最长恭候时期wait.polling_interval = 0.5 # 轮询拒绝wait.ignoring(NoSuchElementException) # 忽略NoSuchElementException荒谬try: element = wait.until(EC.presence_of_element_located((By.ID, "element_id"))) # 元素找到了,不错进行操作了 element.send_keys("Hello")except TimeoutException: print("元素查找超时!")finally: driver.quit()
FluentWait 允许你:
自界说超平淡间 (timeout):最长恭候时期。自界说轮询拒绝 (polling_interval): 每次检查元素状况的时期拒绝,默许是500毫秒。忽略特定荒谬 (ignoring): 在恭候经过中,不错忽略特定的荒谬,比如 NoSuchElementException,让恭候继续进行,直到超时或者找到元素。自界说恭候条目: 你不错编写更复杂的自界说恭候条目,不单是局限于 ExpectedConditions 提供的那些。
FluentWait 的优点:
高度自界说: 不错凭据具体需求,活泼调整恭候参数,兴隆更复杂的恭候场景。容错性更强: 不错忽略特定荒谬,培育剧本的健壮性。
FluentWait 的错误:
使用更复杂: 相干于隐式恭候和显式恭候,FluentWait 的使用略略复杂一些。
恭候战术采选:老K的教唆之谈
优先使用显式恭候: 显式恭候更精确、高效、活泼,是大大齐场景下的最好采选。隐式恭候看成补充: 要是你的技俩中大部分元素加载时期齐差未几,不错开导一个全局的隐式恭候看成补充,但时期不宜过长。严慎使用time.sleep(): time.sleep() 是硬恭候,会让剧本无脑恭候指定时期,非论元素是否仍是加载完成,收尾极低,而且容易导致恭候时期过长或过短,应该尽量幸免使用。除非在一些特殊场景下,比如需要恭候页面动画结束等,不错酌量使用,但也要尽量缩小恭候时期。合理开导超平淡间: 超平淡间开导太短,容易导致误判;开导太长,又会影响剧本收尾。需要凭据实质情况,合理开导超平淡间。齐集实质场景采选恭候条目: 凭据你实质要操作的元素状况,采选符合的 ExpectedConditions,比如要操作的元素需要可见且可点击,就采选 element_to_be_clickable。
回顾
恭候机制是Selenium自动化测试中荒谬迫切的一个纪律,掌捏好恭候机制,不错灵验培育剧本的褂讪性、收尾和可顾惜性。记着老K今天说的这几招,告别Selenium剧本“假死”,让你的自动化测试跑得更快更稳!
临了,别忘了点赞温暖老K,更多自动化测试干货等你来拿!
互动一下: 你在Selenium自动化测试中J9官网,际遇过哪些仙葩的恭候问题?接待在驳倒区共享一下,群众全部疏导学习!
