Как найти раскрывающийся список и выбрать значения без идентификатора и имени класса с пробелами - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь выбрать раскрывающийся список, а затем значения внутри него без идентификатора и имени класса с пробелами.HTML-код, который я просматриваю:

<input class="us-form-input us-form-input us-form-input--blocked autocomplete-input__input us-form-select" type="text" placeholder="Search for address" icon="magnify" value="">
<ul class="us-list--rest address-select__address-list">
    <li><button>Address 1</button></li>
    <li><button>Address 2</button></li>
    <li><button>Address 3</button></li>
    <li data-event="true" data-event-category="gas-electricity" data-event-action="supply-address" data-event-label="address-not-listed">
        <button>My address is not listed</button>
    </li>
</ul>

Я новичок в xpath, но подумал, что классы с пробелами в не могут быть найдены.Я попытался выполнить поиск по заполнителю и значениям в раскрывающемся списке безуспешно.

См. Ниже код Python

from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support import ui
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select

def page_is_loaded(driver):
    return driver.find_element_by_tag_name("body") != None
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://www.uswitch.com/gas-electricity/")
wait = ui.WebDriverWait(driver, 10)
wait.until(page_is_loaded)
search_form = driver.find_element_by_id('input-postcode')
search_form.send_keys('SW7 2BX')
wait = ui.WebDriverWait(driver, 10)
driver.find_element_by_xpath("//*[contains(text(),'Compare energy deals now')]").click()
wait = ui.WebDriverWait(driver, 20)

driver.switch_to.frame(driver.find_element_by_tag_name('iframe'))
#driver.find_element_by_css_selector("us-form-input.us-form-input.us-form-input--blocked").click()
driver.find_element_by_xpath("//input[@placeholder='Search for address']").click()

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Поскольку в HTML присутствует iframe, вам нужно сначала переключиться на iframe, а затем нажать на элемент, вы можете включить iframe следующим образом:

driver.switch_to.frame(driver.find_element_by_tag_name('iframe'))

И затем вы можете нажатьв раскрывающемся меню с помощью xpath:

driver.find_element_by_xpath("//input[@placeholder='Search for address']").click()

И затем вы можете выбрать значение, например:

driver.find_element_by_xpath("//button[text()='Address 1']").click()

Обновленный ответ после обсуждения с OP:

Раскрывающиеся значения отображаются в пользовательском интерфейсе авансом, и iframe также отсутствует над html, поэтому вам не нужно нажимать на выпадающий список или переключаться на iframe, поэтому вам просто нужно использовать следующую строкукод, и он будет работать:

def page_is_loaded(driver):
    return driver.find_element_by_tag_name("body") != None
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://www.uswitch.com/gas-electricity/")
wait = ui.WebDriverWait(driver, 10)
wait.until(page_is_loaded)
search_form = driver.find_element_by_id('input-postcode')
search_form.send_keys('SW7 2BX')
wait = ui.WebDriverWait(driver, 10)
driver.find_element_by_xpath("//*[contains(text(),'Compare energy deals now')]").click()
wait = ui.WebDriverWait(driver, 20)   
driver.find_element_by_xpath("(//ul[contains(@class,'address-select')]//button)[1]").click()

Код в Java: (после обсуждения с OP)

public static void main(String[] args) throws InterruptedException {
    System.setProperty("webdriver.chrome.driver", "path to chromedriver");
    WebDriver driver = new ChromeDriver();
    driver.get("https://www.uswitch.com/gas-electricity/");
    driver.findElement(By.id("input-postcode")).click();
    Thread.sleep(1000);
    driver.findElement(By.id("input-postcode")).sendKeys("SW7 2BX");
    Thread.sleep(5000);
    driver.findElement(By.xpath("//*[contains(text(),'Compare energy deals now')]")).click();
    Thread.sleep(5000);
    driver.findElement(By.xpath("//button[text()='Imperial College, Department Of Mechanical Engineering, Exhibition Road, London, SW7 2BX']")).click();
}
0 голосов
/ 01 апреля 2019

Вы можете попробовать следующий код: -

использовать xpath для элемента раскрывающегося списка.

Селен обеспечивает выбрать класс

from selenium import webdriver
from selenium.webdriver.support.ui import Select

driver = webdriver.Firefox()
driver.get('url')

driver.find_element_by_xpath("xpath_of_dropdownlist").click()

select_Add = Select(driver.find_element_by_id("Address 1"))

select_Add.select_by_index(0)

длядополнительную информацию см. по этой ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...