Selenium 等待元素可点击,使用 python 中的相对元素

Selenium wait until element is clickable, using relative element in python

有一种使用 element_to_be_clickable 方法的方法,将网络元素作为参数传递,而不是像 Java.

中那样传递定位器 (By)

问题是因为我要等待直到它可点击的元素是通过xpath在另一个webelement中以相对方式查找得到的。

<ul class="my-list">
    <li>Coffee</li>
    <li>Tea
        <div class="acction">
            click-me
        </div>
    </li>
    <li>Milk</li>
    <li>bread
        <div class="acction">
            click-me
        </div>
    </li>
</ul>

我的Java代码

var items = driver.findElementsByXPath("//ul[@class='my-list']//li");
items.forEach(item -> {
    try {
        var action = item.findElement(By.xpath(".//div[@class='acction']"));
        wait.until(ExpectedConditions.elementToBeClickable(action)).click();
    } catch (NoSuchElementException ignored) {
    }
});

有没有一种方法可以在 python 中使用硒来做同样的事情?

您可以使用WebDriverWaitlambda来等待简单的自定义条件:

wait = WebDriverWait(driver, 5)

parent = driver.find_element_by_css_selector("some element")

wait.until(lambda ignore:
           parent.find_element_by_css_selector("child element").is_displayed()
           and parent.find_element_by_css_selector("child element").is_enabled()
           , "Element is clickable")

使用你自己的 class:

class element_to_be_clickable(object):
    def __init__(self, element):
        self.element = element

    def __call__(self, ignored):
        if self.element.is_displayed() and self.element.is_enabled():
            return self.element
        else:
            return False

wait = WebDriverWait(driver, 5)

parent = driver.find_element_by_css_selector("some element")
wait.until(element_to_be_clickable(parent.find_element_by_css_selector("input")), "Element is clickable")