Skip to main content
 首页 » 编程设计

python之无法使用 selenium webdriver 延迟按 id 获取元素

2024年10月01日40bhlsheji

我正在尝试使用 Python 通过 selenium 通过 id 获取元素。

问题是测试主机不是那么快,所以网页加载可能持续长达 10-15 秒。

所以,我从这段代码开始:

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 
 
browser = webdriver.Chrome("C:/Users/user/Documents/chromedriver.exe") 
browser.get("my_url") 
delay = 20 # seconds 
try: 
    WebDriverWait(browser, delay).until(EC.presence_of_element_located(browser.find_element_by_id('X4'))) 
    print("Page is ready!") 
except TimeoutException: 
    print("Loading took too much time!") 

但是,这段代码根本无法处理这些异常:

Traceback (most recent call last): 
  File "C:/Users/user/PycharmProjects/testproj/test_scripts/test.py", line 10, in <module> 
    WebDriverWait(browser, delay).until(EC.presence_of_element_located(browser.find_element_by_id('X4'))) 
  File "C:\Program files (x86)\Python\Python36-32\lib\site-packages\selenium-3.4.2-py3.6.egg\selenium\webdriver\remote\webdriver.py", line 285, in find_element_by_id 
    return self.find_element(by=By.ID, value=id_) 
  File "C:\Program files (x86)\Python\Python36-32\lib\site-packages\selenium-3.4.2-py3.6.egg\selenium\webdriver\remote\webdriver.py", line 787, in find_element 
    'value': value})['value'] 
  File "C:\Program files (x86)\Python\Python36-32\lib\site-packages\selenium-3.4.2-py3.6.egg\selenium\webdriver\remote\webdriver.py", line 252, in execute 
    self.error_handler.check_response(response) 
  File "C:\Program files (x86)\Python\Python36-32\lib\site-packages\selenium-3.4.2-py3.6.egg\selenium\webdriver\remote\errorhandler.py", line 194, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"X4"} 

这只是在说:“页面上没有这样的元素”。

奇怪的是,堆栈跟踪甚至在整个页面加载之前就被打印出来了,所以我不知道发生了什么。

我也尝试过获取其他 id 但没有成功 - 似乎问题与某些元素无关。

这是我要检索的页面周围元素的来源:

<div id="X4Edit" class="mandatoryFieldStyle xEdit file_Todo field_L_switch_inbox value_Todo" style="height:20px;"> 
    <div class="xEditInner" style="height:100%;"> 
        <input type="text" id="X4" value="Todo list" scripttype="combo" tabindex="" datachangeevent="817"  
               onkeydown="widgets.Combo.keyDown(event, 'X4');"  
               dvdvar="var/L.switch.inbox" buttonid="" reflabels="" onkeyup="widgets.Combo.keyUp(event, 'X4');"  
               alias="var/L.switch.inbox" name="var/L.switch.inbox"  
               autocomplete="off" role="combobox" aria-autocomplete="list" aria-owns="X4Popup_div" aria-activedescendant="X4Popup_div"  
               aria-haspopup="true" aria-expanded="false" maxlength="" style=" 
                height:18px;margin-top:1px; 
                " selectonly="1" onfocus="widgets.Combo.handleOnFocus(this, event);" onblur="widgets.Combo.handleOnBlur(this, event);"  
               onclick="handleOnClick(this, event);" onchange="handleOnChange(this, event);"> 
    </div> 
    <div id="X4ButtonDiv" class="xButton" tabindex="-1" style=""> 
        <a href="javascript:widgets.Combo.togglePopup('X4', true);void(0);" tabindex="-1" class="image-link" draggable="false" role="presention"> 
          <img id="X4Button" src="images/comboup.png" alt="" draggable="false" tabindex="-1"> 
        </a> 
    </div> 
</div> 

那么,如何通过 ID 正确检索此组合框?下文想尝试设置它的状态。

请您参考如下方法:

您错误地使用了 ExplicitWait:在这一行

WebDriverWait(browser, delay).until(EC.presence_of_element_located(browser.find_element_by_id('X4'))) 

解释器尝试在没有任何等待的情况下执行 browser.find_element_by_id('X4')。您应该将像 (By.ID, "some_id") 这样的可迭代传递给 EC.presence_of_element_located() 而不是 WebElement

尝试使用下面的代码:

try: 
    WebDriverWait(browser, delay).until(EC.presence_of_element_located(("id", "X4"))) 
    print("Page is ready!") 
except TimeoutException: 
    print("Loading took too much time!")