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 中使用硒来做同样的事情?
您可以使用WebDriverWait
和lambda
来等待简单的自定义条件:
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")
有一种使用 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 中使用硒来做同样的事情?
您可以使用WebDriverWait
和lambda
来等待简单的自定义条件:
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")