Когда ES6 теперь широко поддерживается, лучший ответ на этот вопрос изменился. ES6 предоставляет ключевые слова let
и const
для этого точного обстоятельства. Вместо того, чтобы возиться с закрытием, мы можем просто использовать let
для установки переменной области цикла таким образом:
var funcs = [];
for (let i = 0; i < 3; i++) {
funcs[i] = function() {
console.log("My value: " + i);
};
}
val
затем укажет на объект, специфичный для этого конкретного поворота цикл, и вернет правильное значение без дополнительной записи закрытия. Это явно значительно упрощает эту проблему.
const
аналогично let
с дополнительным ограничением на то, что имя переменной не может отскочить к новой ссылке после первоначального присваивания.
Поддержка браузера теперь предназначена для тех, кто ориентирован на последние версии браузеров. const
/ let
в настоящее время поддерживается в последних версиях Firefox, Safari, Edge и Chrome. Он также поддерживается в узле, и вы можете использовать его в любом месте, используя инструменты построения, такие как Babel. Вы можете увидеть рабочий пример здесь: http://jsfiddle.net/ben336/rbU4t/2/
Документы здесь:
Остерегайтесь, однако, что поддержка IE9-IE11 и Edge до Edge 14 let
, но получим неверное (они не создают новый i
каждый раз, поэтому все вышеперечисленные функции будут записывать 3, как если бы мы использовали var
). Edge 14, наконец, получает это право.
Комментарий Леона приводит к правильной информации о том, что сложные имена классов больше не поддерживаются. Вместо этого вы можете попробовать использовать селектора css. В вашем случае следующая строка кода должна помочь вам получить нужный элемент:
el3 = driver.find_element_by_css_selector(".action-btn.cancel.alert-display")
Он находит элемент со всеми тремя классами (action-btn, cancel и alert-display) в классе атрибут. Обратите внимание, что порядок классов здесь не имеет значения, и любой из классов может появляться в любом месте атрибута класса. Пока элемент имеет все три класса, он будет выбран. Если вы хотите, чтобы порядок классов был исправлен, вы можете использовать следующий xpath:
el3 = driver.find_element_by_xpath("//*[@class='action-btn cancel alert-display']")
Я опаздываю на этот вопрос. Но я также нашел работу, рассматривая сложные классы как String, используя tag_name и get_attribute ('class'), когда вы не знакомы с Xpath. Ему нужны еще несколько строк кода, но он прямолинейный и подходит для начинающих, таких как я.
elements = driver.find_elements_by_tag_name('Tag Name Here')
for element in elments:
className = watchingTable.get_attribute('class')
print(className)
if className == 'Your Needed Classname':
#Do your things