Как вы можете видеть из примера. Селекторы работают, когда они динамически генерируются. Я считаю, что у вас есть проблема с вложенными селекторами в css.
let buttons = [];
const CLS = ["thin", "button"];
let add_btns = document.querySelector('.add-btn');
add_btns.addEventListener("click", function () {
let i = 0;
while (i <= 40) {
let btn = document.createElement("BUTTON");
buttons.push(document.body.appendChild(btn));
i++;
for (let button in buttons) {
btn.setAttribute('id', "button " + button);
btn.classList.add(...CLS);
btn.innerHTML = "Button # " + button;
}
btn.addEventListener("click", function () {
let id = this.id;
alert("my id is: " + id);
});
}
});
.button {
padding: 10px;
}
.thin {
padding: 0px 10px;
}
<button class="add-btn button">Add</button>
В контексте Selenium ссылка является устаревшей , когда ссылка недействительна, поскольку указанный элемент был удален или устарел, так как элемент был отсоединен и затем присоединен клиентским скриптом , Не зная точной механики клиентского скрипта, возможны разные решения. Самое простое - попытаться снова сослаться на элемент, т. Е.
queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6).gwtListBox"))
queues.select_by_visible_text("P0_English")
time.sleep(3)
queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6).gwtListBox"))
queues.select_by_visible_text("P1_English")
time.sleep(3)
queues = Select(driver.find_element_by_css_selector(".rowStyle1:nth-child(6).gwtListBox"))
queues.select_by_visible_text("P5_English")
Предполагается, что селектор CSS остается прежним после повторного присоединения списка выбора. Также существует вероятность того, что селектор станет недействительным, поскольку элемент был удален или его местоположение было изменено. В первом случае вы хотите создать исключение и обработать его соответствующим образом, а во втором - выяснить, каким будет его новый селектор, либо эмпирически, либо с помощью анализа кода скрипта на стороне клиента. Подробнее об исключении StaleElementReferenceException здесь .
Чтобы выбрать несколько опций из элемента Multi Select , вы можете использовать ActionChains , чтобы смоделировать . Управление Нажмите следующим образом:
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
myElemA = driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox option[value='P0_English']")
myElemB = driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox option[value='P1_English']")
myElemC = driver.find_element_by_css_selector(".rowStyle1:nth-child(6) .gwt-ListBox option[value='P5_English']")
ActionChains(driver).key_down(Keys.CONTROL).click(myElemA).key_up(Keys.CONTROL).perform()
ActionChains(driver).key_down(Keys.CONTROL).click(myElemB).key_up(Keys.CONTROL).perform()
ActionChains(driver).key_down(Keys.CONTROL).click(myElemC).key_up(Keys.CONTROL).perform()