当前位置: 首页 > 知识库问答 >
问题:

Selenium Python:WebDrive等待TimeoutException

虞华翰
2023-03-14

我对Selenium和Python是新手。我可以浏览网站,找到元素并打印出来,但速度很慢

Python版本:3.10;Selenium WebDrive:Firefox;IDE:PyCharm 2021.3.2(CE);操作系统:Fedora 35 VM

我试图打印的元素的HTML代码:

<input id="b8-b36-Input_RemainAmtYr1"
class="form-control OSFillParent" data-
input="" disabled="" type="text"
style="margin-top: 5px;" value="$10.50">
event

我的Python Selenium找到了大部分时间都能正常工作的代码(但当服务器需要很长时间才能响应时失败):

print('Remaining 2022 Deductible:',driver.find_element(By.CSS_SELECTOR, "input.form-control.OSFillParent[id$='Input_RemainAmtYr1']").get_attribute("value"))

产生错误的显式等待代码:

print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input.form-control.OSFillParent[id$='Input_RemainAmtYr1']"))).get_attribute("value"))

这是从显式等待代码生成的回溯:

回溯(最后一次调用):文件“/主页/usr/Documents/Training/Python\u Automation\u Testing/Exercise Files/print\u value.py”,第122行,打印(WebDriverWait(驱动程序,20)。直到(EC.visibility\u of\u element\u located((By.CSS\u SELECTOR,“input.form control.OSFillParent[id$='input\u remainatyr1']))。get\u attribute(“value”))File“/usr/local/lib/python3.10/site packages/selenium/webdriver/support/wait.py”,第89行,在until raise TimeoutException(message,screen,stacktrace)selenium中。常见的例外情况。TimeoutException:消息:

注意:我使用以下导入:

来自硒。webdriver。支持ui导入WebDriverWait

来自硒。webdriver。常见的按导入方式

从selenium.webdriver.support进口expected_conditionsEC

共有1个答案

梁丘诚
2023-03-14

在这种情况下,您需要驱动程序在查找元素之前切换到该选项卡:

driver.switch_to.window(driver.window_handles[-1])

*将window\u句柄的索引更改为要关注的选项卡

还请注意,在完成该选项卡后(即关闭该选项卡并返回到原始选项卡),您需要告诉驾驶员使用同一行代码再次切换回。

任何访问此页面的人都希望TimeoutException返回布尔值,而不是引发异常,您可以尝试以下操作:

#return boolean value instead of throwing exception
def check_elem_exists(parent, by, selector, wait=False, timeout=False):
    if not wait:
        try:
            parent.find_element(by, selector)
        except NoSuchElementException:
            return False
        else:
            return True
    #when allowing wait time - print note for what is happening
    print('%s - check_elem_exists(%is..)' %(selector,timeout))
    try:
        WebDriverWait(parent, timeout).until(EC.presence_of_element_located((by, selector)))
    except NoSuchElementException:
        return False
    except TimeoutException:
        return False
    else:
        return True

#search without wait time
elem1 = check_elem_exists(driver, By.XPATH, "//div[@class='elem1']")
#search with wait time (i.e waiting for page to load)
elem2 = check_elem_exists(driver, By.XPATH, "//div[@class='elem2']", True, 10)

查找有用的XPATH备忘单:
https://devhints.io/xpath

 类似资料:
  • 我正在尝试将数据库调用移出控制器,以清理并使其可测试。当它们在控制器中时,一切都会顺利进行。我将它们移出控制器,并添加了一个异步,以确保我们等待。否则,我将调用的中的函数。现在,一旦我使用async/await,控制器中的函数就会认为没有用户,因为它没有等待。 有几个关于异步等待的SO问题,但我没有找到一个解决我的问题。我确实验证了返回了我的用户,并添加了控制台日志来显示路径。 节点猫鼬异步等待似

  • 我在网上搜索了很多关于vs await async,但是在这个特定的使用场景中,我并不真正理解其中的区别。我相信情况很简单。 vs. 其中,是一个异步方法,其中包含一些异步调用,例如使用wait调用db。 问题: 在这种情况下,两者之间有什么区别吗?任何帮助或意见,谢谢!

  • 问题内容: 如何更改以下代码,以触发两个异步操作并有机会同时运行? 我需要做这样的事情吗? 问题答案: TL; DR 不要在获得承诺的问题中使用模式,而是分别等待它们;而是使用(至少现在): 虽然您的解决方案 确实 并行运行这两个操作,但如果两个诺言都被拒绝,它就无法正确处理拒绝。 细节: 您的解决方案并行运行它们,但始终等待第一个完成,然后再等待第二个。 如果您只想启动它们,并行运行它们,并获得

  • 问题内容: 我已经看到和在使用selenium的代码。使用轮询技术,即它将针对特定的每个固定间隔进行轮询。我想知道如何处理? 考虑以下Java示例: 监视器是否可单击,或者等待18秒钟再单击? 问题答案: 在您的示例中,在超时之前,将持续18秒(每0.5秒)查找一次“帐户”。 是的子类。在其中,您可以配置更多选项以及最长的等待时间,例如轮询间隔,忽略的异常等。此外,在您的代码中,您无需等待,然后可

  • 问题内容: 我如何更改以下代码,以触发两个异步操作并有机会同时运行? 我需要做这样的事情吗? 问题答案: TL; DR 不要在获得承诺的问题中使用模式,而是分别等待它们;而是使用(至少现在): 虽然您的解决方案确实并行运行这两个操作,但是如果两个诺言都被拒绝,它就无法正确处理拒绝。 细节: 您的解决方案并行运行它们,但始终等待第一个完成,然后再等待第二个。如果您只想启动它们,并行运行它们,并获得两

  • 如果吊舱已经处于状态,我还希望命令立即返回。但这不会发生。 kubectl wait不是我要找的命令吗?