Selenium ждет, пока все указанные веб-элементы не будут изменены или исчезнут - PullRequest
0 голосов
/ 04 марта 2020

Предположим, есть блок HTML

<div id='list'>
   <p>hello</p>
   <div class='locked'>world</div>
   <p>你好</p>
   <div class='locked'>世界</div>
</div>

, как использовать селен с python, чтобы подождать некоторое время, пока все теги <div class='locked'> не станут чем-то другим. (например. <div class='unlock'>xxx</div>

Спасибо!

Ответы [ 3 ]

3 голосов
/ 04 марта 2020

Можно написать пользовательскую ожидаемую проверку условий для указанного c состояния, которое вам необходимо достичь. Как и в вашем сценарии, вы хотите, чтобы элементы управления с заблокированным состоянием или классом находились под счетом 0, чтобы продолжить работу. Я привел пример кода, который можно использовать для пользовательской функции Syn c. Я новичок в Selenium на python, но думаю, что это должно сработать, если вы используете xpath для идентификации заблокированных элементов управления состоянием.

-------------- Обновлено с Python Код -------------------------- -

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

class WaitForLockStateChange:
def __init__(self, locator):
    self.locator = locator

def __call__(self, driver):
    return len(driver.find_elements_by_xpath(self.locator)) == 0 


wait = WebDriverWait(driver, 10)
element = wait.until(WaitForLockStateChange("//div[@class='locked']"))
1 голос
/ 04 марта 2020

У меня есть специально созданный класс, который я создал для очень похожей цели (в моем случае меня интересовали изменения свойства «value», но я изменил его, чтобы он соответствовал вашему примеру изменения «class»):

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

class WaitForAttrValueChange:
    def __init__(self, locator, val_):
        self.locator = locator
        self.val = val_

    def __call__(self, driver):
        try:
            attr_value = EC._find_element(driver, self.locator).get_property('className')
            return attr_value.startswith(self.val)
        except SE.StaleElementReferenceException:
            return False 

Затем вы можете использовать его с WebDriverWait (очевидно, вы можете использовать любой By метод идентификации вместо By.ID, это всего лишь пример):

WebDriverWait(driver, 20).until(WaitForAttrValueChange((By.ID, 'id'), 'locked'))
0 голосов
/ 05 марта 2020

Используя Selenium с , чтобы дождаться, пока все теги <div class='locked'> станут <div class='unlock'>xxx</div>, вы должны вызвать WebDriverWait для visibility_of_all_elements_located() и вы можете использовать любую из следующих стратегий локатора :

  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div#list div.unlock")))
    
  • Использование XPATH:

    WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@id='list']//div[@class='unlock']")))
    
  • Примечание : необходимо добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
...