提问人:fbx61588 提问时间:7/28/2023 最后编辑:fbx61588 更新时间:7/29/2023 访问量:61
Selenium 忽略 WebDriverWait 并改为执行操作
Selenium ignores WebDriverWait and perform action instead
问:
测试有多次点击重定向到其他页面,所以我在那里添加了一些明确的等待,但是当执行测试时,Selenium会忽略两个等待中的一个并执行点击。只有当它已经加载了下一页时,显式等待才会执行,当然会引发 TimeoutException,因为它无法在那里找到元素。另外,我需要提一下,有时测试可以正确执行,但我认为这是因为页面已及时加载。
def test_two(browser):
browser.get('http://localhost/index.php?route=common/home&language=en-gb')
macbook = browser.find_element(By.CSS_SELECTOR, "#content > div.row > div:nth-child(1) > form > div > div.content > div.button-group > button:nth-child(3)")
iphone = browser.find_element(By.CSS_SELECTOR, "#content > div.row > div:nth-child(2) > form > div > div.content > div.button-group > button:nth-child(3)")
browser.execute_script("arguments[0].click();", macbook)
browser.execute_script("arguments[0].click();", iphone)
browser.get('http://localhost/index.php?route=product/compare&language=en-gb')
delete_macbook = WebDriverWait(browser, 3).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#content > table > tbody:nth-child(7) > tr > td:nth-child(2) > form > a")))
browser.execute_script("arguments[0].click();", delete_macbook)
delete_iphone = WebDriverWait(browser, 3).until(EC.presence_of_element_located((By.LINK_TEXT, "Remove")))
browser.execute_script("arguments[0].click();", delete_iphone)
我还尝试在Firefox(最初是Chrome)中运行此测试,它正确地满足了每个显式等待。那么可能是浏览器或驱动程序问题吗?
-由新手撰写
答:
0赞
undetected Selenium
7/29/2023
#1
理想情况下,要单击任何可单击的元素而不是 presence_of_element_located(),您需要诱导 WebDriverWait 获取 element_to_be_clickable(),并且可以使用以下任一定位器策略:
def test_two(browser):
browser.get('http://localhost/index.php?route=common/home&language=en-gb')
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#content > div.row > div:nth-child(1) > form > div > div.content > div.button-group > button:nth-child(3)"))).click()
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#content > div.row > div:nth-child(2) > form > div > div.content > div.button-group > button:nth-child(3)"))).click()
browser.get('http://localhost/index.php?route=product/compare&language=en-gb')
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#content > table > tbody:nth-child(7) > tr > td:nth-child(2) > form > a"))).click()
WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Remove"))).click()
评论
0赞
fbx61588
7/31/2023
谢谢你的回答。除此之外,我还添加了一些异常处理。
0赞
undetected Selenium
7/31/2023
@fbx61588 很高兴能够帮助你。当有人回答我的问题时,我该怎么办?
评论
time.sleep(3)
browser.get(...
import time
EC.presence_of_element_located
EC.element_to_be_clickable