Может ли селен автоматически обнаруживать текстовое поле на веб-странице и вводить значения?

Я новичок в автоматизации тестирования. Изучив основы селена, я знаю, что могу использовать инструменты селена для заполнения некоторых онлайн-форм. Ниже приведен код, который я использую для справки:

elem = self.driver.find_element_by_xpath("//*[@title='Registration']")
elem.click()
iframe = self.driver.find_elements_by_id('frm_reg_load_patient')[0]
self.driver.switch_to.default_content()
self.driver.switch_to.frame(iframe)
elem = self.driver.find_element_by_id("txtPatientLastName")
elem.clear()
elem.send_keys("Peng")
elem = self.driver.find_element_by_id("txtPatientFirstName")
elem.clear()
elem.send_keys("Richard")

А вот скриншот из сети:

введите здесь описание изображения

Мой вопрос, возможно ли автоматически найти текстовое поле и заполнить некоторые случайные значения. Я просто проверяю, можно ли создать новую запись, поэтому значения не важны.

Спасибо


person Weining Peng    schedule 07.12.2018    source источник
comment
Я предполагаю, что вы пытаетесь спросить, это вызвать функцию, которая будет искать все элементы input на странице и заполнять ее случайными данными. В настоящее время такая функция недоступна в селене, но я думаю, что вы можете создать такую ​​функцию, если это необходимо, с помощью селена API.   -  person Kamal    schedule 07.12.2018
comment
@kmal да. Это именно то, что я ищу. Любая идея о том, как создать эту функцию?   -  person Weining Peng    schedule 07.12.2018
comment
Вы можете прочитать больше о селене и вызвать функцию, которая получит все элементы тега input, используя один из методов find_elements.. (вы также можете проверить, видны ли эти элементы на вашей странице или нет). Затем вы можете создать цикл для прохождения каждого из них и ввести несколько случайных/одинаковых строк для каждого из них. Вы должны начать программировать и задать новый вопрос здесь, если у вас возникнут какие-либо проблемы.   -  person Kamal    schedule 07.12.2018


Ответы (2)


Поскольку желаемые элементы находятся внутри <iframe>, вам необходимо:

  • Вызовите WebDriverWait, чтобы желаемый кадр стал доступным, и переключитесь на него.
  • Вызовите WebDriverWait, чтобы нужный элемент стал активным.
  • Вы можете использовать следующее решение:

    WebDriverWait(self.driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"frm_reg_load_patient")))
    WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.ID, "txtPatientLastName"))).send_keys("Peng")
    self.driver.find_element_by_id("txtPatientFirstName").send_keys("Richard")
    
  • Примечание. Вы должны добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Обновлять

Согласно обновлению вашего комментария, ваш сценарий/программа будет более эффективным, заменив неявное ожидание на WebDriverWait, но, честно говоря, нет готовых function() доступных для прокрутки страницы до найти любой элемент как таковой и заполнить случайными данными. Написание новой функции wrapper лучше удовлетворит ваши потребности, но это должно быть выходом за рамки для этого вопроса.

person DebanjanB    schedule 07.12.2018
comment
спасибо за знакомство с модулем. Исходный код фактически работает без неявного ожидания. Я пытаюсь найти/создать функцию, которая может перемещаться по странице, чтобы найти любой элемент, например текстовое поле, и заполнить случайными данными. - person Weining Peng; 07.12.2018
comment
@WeiningPeng Пожалуйста, проверьте обновление ответа и дайте мне знать статус - person DebanjanB; 07.12.2018

Я нашел ответ сам. Если у кого-то есть такой же вопрос:

//find all input fields where type = text or password and store them In array list 
txtfields.
 List<WebElement> txtfields = driver.findElements(By.xpath("//input[@type='text' or 
 @type='password']"));

//for loop to send text In all text box one by one.
 for(int a=0; a<txtfields.size();a++){   
 txtfields.get(a).sendKeys("Text"+(a+1));  
 }
 Thread.sleep(3000);
person Weining Peng    schedule 07.12.2018