Неявные ожидания и несколько элементов xpath - PullRequest
0 голосов
/ 14 июня 2019

Что я хочу сделать, так это проверить, существует ли одна из 3 строк, поэтому я хочу, чтобы она проверяла адрес электронной почты или электронную почту, и, если это так, отправляет входные данные, не зная, как это сделать.

driver.find_element_by_xpath('//span[contains(text(),"email address")]')
driver.find_element_by_xpath('//span[contains(text(),"email")]')

Я бы хотел, чтобы они были в одной строке, но не уверен, как.

driver.implicitly_wait(1540)
driver.find_element_by_xpath('//span[contains(text(),"email address")]')
driver.find_element_by_xpath('//[@id="inputE"]').send_keys(email)
driver.find_element_by_xpath('//[@id="j_id0:j_id2:j_id3:j_id39"]/button').click()```

Ответы [ 4 ]

0 голосов
/ 14 июня 2019

Вот пример xpath, как вы можете решить эту проблему. В основном, здесь мы проверяем, есть ли какой-либо промежуток в div (измените его на основе иерархии вашего приложения) с указанным текстом.

Просто для понимания цели я добавил оба пролета в один и тот же HTML. Я уверен, что xpath выберет, существует ли один из них в заданном пути.

Пример HTML:

<html>
  <div>
	<span>email</span>
	<input placeholder="email"></input>
  </div>
  <div>
	<span>email id</span>
	<input placeholder="email id"></input>
  </div>
  
  <div>
	<span>email address</span>
	<input placeholder="email address"></input>
  </div>
</html>

Xpath:

//div[contains("'email','email id'",span)]/input

Скриншот:

enter image description here

0 голосов
/ 14 июня 2019

Вместо неявного использования явного условия ожидания Вот пример кода:

WebDriverWait wait= new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.visibilityOf("Element_path"));

После применения явного ожидания выполните операцию, которую вы хотите выполнить.

0 голосов
/ 14 июня 2019

Используйте WebDriverwait и presence_of_all_elements_located и используйте xpath. Затем проверьте счетчик длины элемента, если больше 0, он войдет внутрь блока и выполнит оставшийся код.

if (len(WebDriverWait(driver,20).until(EC.presence_of_all_elements_located((By.XPATH,"//span[contains(.,'email') or contains(.,'email address')]"))))>0):
    driver.find_element_by_xpath('//*[@id="inputE"]').send_keys('email')
    driver.find_element_by_xpath('//*[@id="j_id0:j_id2:j_id3:j_id39"]/button').click()

Вам необходимо добавить следующие операции импорта для выполнения кода выше.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
0 голосов
/ 14 июня 2019

Вы можете сделать что-то вроде этого:

Этот xpath //[@id="inputE"], я изменил его на id: inputE, который выглядит довольно статично.

Там нет ни одноготребование для driver.implicitly_wait(1540) с 1540, вместо этого старайтесь уделять меньше времени там.

Вы можете выбрать Явное ожидание для этого сценария, в котором говорится, что вы никогда не должны смешивать неявное с явное .

try:
 if driver.find_element_by_xpath('//span[contains(text(),"email address")]').is_displayed():
   driver.find_element_by_id('inputE').send_keys("email_address")
except NoSuchElementException:
   print("Email address input field is not found")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...